feat: external ip provider plain
This commit is contained in:
56
pkg/externalIpProvider/plain/plain.go
Normal file
56
pkg/externalIpProvider/plain/plain.go
Normal file
@@ -0,0 +1,56 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user