You've already forked ddns-updater
50 lines
941 B
Go
50 lines
941 B
Go
package public_resolvers
|
|
|
|
import (
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
CloudflareTraceTag = "1.1.1.1"
|
|
CloudflareTraceUrl = "https://1.1.1.1/cdn-cgi/trace"
|
|
|
|
ipPrefix = "ip="
|
|
)
|
|
|
|
type CloudflareTrace struct {
|
|
baseResolver
|
|
}
|
|
|
|
func NewDefaultCloudflareTrace() *CloudflareTrace {
|
|
return NewCloudflareTrace(&http.Client{
|
|
Timeout: 10 * time.Second,
|
|
})
|
|
}
|
|
|
|
func cloudflareTraceResponseParser(reader io.Reader) (string, error) {
|
|
data, err := io.ReadAll(reader)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
for _, row := range strings.Split(string(data), "\n") {
|
|
if strings.Index(row, ipPrefix) == 0 {
|
|
return strings.TrimSpace(strings.ReplaceAll(row, ipPrefix, "")), nil
|
|
}
|
|
}
|
|
return "", NoIPInResponseError
|
|
}
|
|
|
|
func NewCloudflareTrace(client Doer) *CloudflareTrace {
|
|
return &CloudflareTrace{
|
|
baseResolver: baseResolver{
|
|
client: client,
|
|
url: CloudflareTraceUrl,
|
|
ipParser: cloudflareTraceResponseParser,
|
|
},
|
|
}
|
|
}
|