package http import ( "context" "io" "net" "net/http" "strings" httputils "dnsupdater/http" "dnsupdater/ip/internal" ) type Decoder func(io.Reader) ([]byte, error) type Service struct { ServiceName string Url string Headers http.Header Decoder Decoder } func (s Service) Name() string { return s.ServiceName } func (s Service) Lookup(ctx context.Context) (net.IP, error) { resp, err := httputils.Get(ctx, s.Url, s.Headers) if err != nil { return nil, err } if s.Decoder == nil { s.Decoder = io.ReadAll } body, err := s.Decoder(resp.Body) if err != nil { return nil, err } // Trim spaces and stuff. ip_str := strings.TrimSpace(string(body)) return internal.ParseIP(ip_str) }