Files

56 lines
1.1 KiB
Go
Raw Permalink Normal View History

2023-05-01 10:01:43 +02:00
package public_resolvers
import (
"context"
2023-05-03 23:06:57 +02:00
"errors"
2023-05-01 10:01:43 +02:00
"fmt"
"io"
"net"
"net/http"
)
2023-05-03 23:06:57 +02:00
var NoIPInResponseError = errors.New("no ip found in response")
2023-05-01 10:01:43 +02:00
type Doer interface {
Do(*http.Request) (*http.Response, error)
}
2023-05-03 23:06:57 +02:00
type ipParserFunc func(reader io.Reader) (string, error)
func defaultIpParser(reader io.Reader) (string, error) {
out, err := io.ReadAll(reader)
return string(out), err
}
2023-05-01 10:01:43 +02:00
type baseResolver struct {
2023-05-03 23:06:57 +02:00
client Doer
url string
ipParser ipParserFunc
2023-05-01 10:01:43 +02:00
}
func (i baseResolver) ResolvePublicIp(ctx context.Context) (net.IP, error) {
req, err := http.NewRequestWithContext(ctx, http.MethodGet, i.url, nil)
if err != nil {
return net.IP{}, fmt.Errorf("error creating ifconfig request: %w", err)
}
resp, err := i.client.Do(req)
if err != nil {
return net.IP{}, err
}
defer func() {
_ = resp.Body.Close()
}()
if resp.StatusCode != http.StatusOK {
return net.IP{}, fmt.Errorf("unexpected response code %d", resp.StatusCode)
}
2023-05-03 23:06:57 +02:00
ipText, err := i.ipParser(resp.Body)
2023-05-01 10:01:43 +02:00
if err != nil {
return net.IP{}, fmt.Errorf("error reading body: %w", err)
}
2023-05-03 23:06:57 +02:00
return net.ParseIP(ipText), nil
2023-05-01 10:01:43 +02:00
}