package externalIpProvider import ( "errors" "net" "net/http" "net/url" externalIpProvider "realdnydns/pkg/externalIpProvider" ) type ExternalIpProviderImplPlain struct { IPProviderURL string HTTPClient *http.Client } type PlainExternalIpProviderConfig struct { Url string `yaml:"url"` } func New(config PlainExternalIpProviderConfig) (externalIpProvider.ExternalIpProvider, error) { if config.Url == "" { return nil, errors.New("url is required") } return &ExternalIpProviderImplPlain{ config.Url, &http.Client{}, }, nil } func (p *ExternalIpProviderImplPlain) GetExternalIp() (net.IP, error) { parsedUrl, err := url.Parse(p.IPProviderURL) if err != nil { return nil, err } res, err := p.HTTPClient.Get(parsedUrl.String()) if err != nil { return nil, err } if res.StatusCode != 200 { return nil, errors.New("unexpected status code") } responseBody := make([]byte, res.ContentLength) res.Body.Read(responseBody) defer res.Body.Close() parsedIp := net.ParseIP(string(responseBody)) if parsedIp == nil { return nil, errors.New("unable to parse ip") } return parsedIp, nil }