@@ -13,29 +13,40 @@ import (
1313)
1414
1515type WebserviceResponse struct {
16- Success bool
17- Message string
18- Domain string
19- Domains []string
16+ Success bool
17+ Message string
18+ Domain string
19+ Domains []string
20+ Address string
21+ AddrType string
22+ Addresses []Address
23+ }
24+
25+ type Address struct {
2026 Address string
2127 AddrType string
2228}
2329
24- func addrType (address string ) string {
30+ func ParseAddress (address string ) ( Address , error ) {
2531 if ipparser .ValidIP4 (address ) {
26- return "A"
32+ return Address { Address : address , AddrType : "A" }, nil
2733 } else if ipparser .ValidIP6 (address ) {
28- return "AAAA"
34+ return Address { Address : address , AddrType : "AAAA" }, nil
2935 }
30- return ""
36+ return Address {}, fmt . Errorf ( "Invalid ip address: %s" , address )
3137}
3238
3339func BuildWebserviceResponseFromRequest (r * http.Request , appConfig * Config , extractors requestDataExtractor ) WebserviceResponse {
3440 response := WebserviceResponse {}
3541
3642 sharedSecret := extractors .Secret (r )
3743 response .Domains = strings .Split (extractors .Domain (r ), "," )
38- response .Address = extractors .Address (r )
44+ for _ , address := range strings .Split (extractors .Address (r ), "," ) {
45+ var parsedAddress , error = ParseAddress (address )
46+ if error == nil {
47+ response .Addresses = append (response .Addresses , parsedAddress )
48+ }
49+ }
3950
4051 if sharedSecret != appConfig .SharedSecret {
4152 log .Println (fmt .Sprintf ("Invalid shared secret: %s" , sharedSecret ))
@@ -53,30 +64,32 @@ func BuildWebserviceResponseFromRequest(r *http.Request, appConfig *Config, extr
5364 }
5465 }
5566
56- // kept in the response for compatibility reasons
57- response .Domain = strings .Join (response .Domains , "," )
58-
59- response .AddrType = addrType (response .Address )
60- if response .AddrType == "" { // address type unknown. Fall back to get address by request
67+ if len (response .Addresses ) == 0 {
6168 ip , err := getUserIP (r )
6269 if ip == "" {
6370 ip , _ , err = net .SplitHostPort (r .RemoteAddr )
6471 }
6572
66- if err != nil {
67- ip = "" // will fail later
73+ if err == nil {
74+ parsedAddress , err := ParseAddress (ip )
75+ if err == nil {
76+ response .Addresses = append (response .Addresses , parsedAddress )
77+ }
6878 }
69- response .Address = ip
70- response .AddrType = addrType (response .Address )
7179 }
7280
73- if response .AddrType == "" {
81+ if len ( response .Addresses ) == 0 {
7482 response .Success = false
75- response .Message = fmt .Sprintf ("%s is neither a valid IPv4 nor IPv6 address" , response .Address )
76- log .Println (fmt .Sprintf ("Invalid address: %s " , response .Address ))
83+ response .Message = fmt .Sprintf ("%v is neither a valid IPv4 nor IPv6 address" , response .Addresses )
84+ log .Println (fmt .Sprintf ("Invalid address: %v " , response .Addresses ))
7785 return response
7886 }
7987
88+ // kept in the response for compatibility reasons
89+ response .Domain = strings .Join (response .Domains , "," )
90+ response .Address = response .Addresses [0 ].Address
91+ response .AddrType = response .Addresses [0 ].AddrType
92+
8093 response .Success = true
8194
8295 return response
0 commit comments