From e40bd4ef29ed9263d55e32188df6729ace4c5491 Mon Sep 17 00:00:00 2001 From: Adam L <319494+we11adam@users.noreply.github.com> Date: Thu, 26 Dec 2024 17:15:44 +0800 Subject: [PATCH] feat: proxy support for cloudflare --- README.md | 1 + updater/cloudflare/cloudflare.go | 27 +++++++++++++++++++++++---- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index fbed866..6ed7447 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,7 @@ updaters: email: "user@exmaple.com" # Cloudflare account email apikey: fd25bdc03a4c17450aa4327aa37de4573270f # Cloudflare API key domain: ddns.yourdomain.com # Domain to update + proxy: http://127.0.0.1:2080 # Optional # lightdns: # Use LightDNS as the updater # key: bgw99xiio5ewbphb # domain: uddns.dyn.la diff --git a/updater/cloudflare/cloudflare.go b/updater/cloudflare/cloudflare.go index 2dfaec0..6c2b4c0 100644 --- a/updater/cloudflare/cloudflare.go +++ b/updater/cloudflare/cloudflare.go @@ -5,6 +5,8 @@ import ( "fmt" "log/slog" "net" + "net/http" + "net/url" "strings" "github.com/cloudflare/cloudflare-go" @@ -24,6 +26,7 @@ type Config struct { APIKey string `mapstructure:"apikey"` APIToken string `mapstructure:"apitoken"` Domain string `mapstructure:"domain"` + Proxy string `mapstructure:"proxy"` } type Cloudflare struct { @@ -49,16 +52,32 @@ func New(config *Config) (*Cloudflare, error) { } var ( - api *cloudflare.API - err error + api *cloudflare.API + httpClient *http.Client + err error ) + if config.Proxy == "" { + httpClient = &http.Client{} + } else { + proxy, err := url.Parse(config.Proxy) + if err != nil { + return nil, fmt.Errorf("failed to parse Cloudflare proxy URL: %w", err) + } + slog.Info("[Cloudflare] Using proxy", "proxy", config.Proxy) + httpClient = &http.Client{ + Transport: &http.Transport{ + Proxy: http.ProxyURL(proxy), + }, + } + } + if config.APIToken != "" { slog.Debug("[Cloudflare] Using API Token for authentication") - api, err = cloudflare.NewWithAPIToken(config.APIToken) + api, err = cloudflare.NewWithAPIToken(config.APIToken, cloudflare.HTTPClient(httpClient)) } else if config.APIKey != "" && config.Email != "" { slog.Debug("[Cloudflare] Using API Key and Email for authentication") - api, err = cloudflare.New(config.APIKey, config.Email) + api, err = cloudflare.New(config.APIKey, config.Email, cloudflare.HTTPClient(httpClient)) } else { return nil, fmt.Errorf("Cloudflare configuration error: either APIToken or both APIKey and Email must be provided") }