Files
realDynDNS/pkg/externalIpProvider/plain/plain.go
Timo Behrendt a79ce64e82
All checks were successful
CD / Check changes (push) Successful in 6s
CD / test (push) Successful in 2m48s
CD / Build and push (amd64) (push) Successful in 40s
CD / Build and push (arm64) (push) Successful in 2m40s
CD / Create manifest (push) Successful in 8s
fix(externalIpProvider/plain): when reading response body (#54)
Fixing an error where the service crashes reading the response body, when no content-length header was provided in the response.

Reviewed-on: #54
Reviewed-by: branch-buddy <branch-buddy@t00n.de>
Co-authored-by: Timo Behrendt <t.behrendt@t00n.de>
Co-committed-by: Timo Behrendt <t.behrendt@t00n.de>
2025-11-07 17:14:14 +01:00

61 lines
1.1 KiB
Go

package externalIpProvider
import (
"errors"
"io"
"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 {
res.Body.Close()
return nil, errors.New("unexpected status code")
}
responseBody, err := io.ReadAll(res.Body)
res.Body.Close()
if err != nil {
return nil, err
}
parsedIp := net.ParseIP(string(responseBody))
if parsedIp == nil {
return nil, errors.New("unable to parse ip")
}
return parsedIp, nil
}