diff --git a/go.mod b/go.mod index d8aca44..efd4682 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/go-chi/chi/v5 v5.0.11 // indirect github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/mwitkow/go-http-dialer v0.0.0-20161116154839-378f744fb2b8 // indirect golang.org/x/net v0.20.0 // indirect ) diff --git a/go.sum b/go.sum index 2cb773f..c39f9a8 100644 --- a/go.sum +++ b/go.sum @@ -17,6 +17,8 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OH github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/mwitkow/go-http-dialer v0.0.0-20161116154839-378f744fb2b8 h1:BhQQWYKJwXPtAhm12d4gQU4LKS9Yov22yOrDc2QA7ho= +github.com/mwitkow/go-http-dialer v0.0.0-20161116154839-378f744fb2b8/go.mod h1:ntWhh7pzdiiRKBMxUB5iG+Q2gmZBxGxpX1KyK6N8kX8= github.com/orcaman/concurrent-map/v2 v2.0.1 h1:jOJ5Pg2w1oeB6PeDurIYf6k9PQ+aTITr/6lP/L/zp6c= github.com/orcaman/concurrent-map/v2 v2.0.1/go.mod h1:9Eq3TG2oBe5FirmYWQfYO5iH1q0Jv47PLaNK++uCdOM= github.com/panjf2000/ants/v2 v2.8.2 h1:D1wfANttg8uXhC9149gRt1PDQ+dLVFjNXkCEycMcvQQ= diff --git a/pkg/http/client.go b/pkg/http/client.go index e9f0afc..99c30e9 100644 --- a/pkg/http/client.go +++ b/pkg/http/client.go @@ -16,6 +16,7 @@ import ( "github.com/debridmediamanager/zurg/internal/config" "github.com/debridmediamanager/zurg/pkg/hosts" "github.com/debridmediamanager/zurg/pkg/logutil" + http_dialer "github.com/mwitkow/go-http-dialer" "golang.org/x/net/proxy" cmap "github.com/orcaman/concurrent-map/v2" @@ -119,12 +120,11 @@ func NewHTTPClient(token string, maxRetries int, timeoutSecs int, ensureIPv6Host log.Errorf("Failed to parse proxy URL: %v", err) return nil } - proxyDialer, err := proxy.FromURL(proxyURL, dialer) + dialer, err = proxyDialer(proxyURL) if err != nil { log.Errorf("Failed to create proxy dialer: %v", err) return nil } - dialer = proxyDialer } if cfg.ShouldForceIPv6() { @@ -245,3 +245,15 @@ func (r *HTTPClient) replaceHostIfNeeded(req *http.Request) { req.URL.Host = newHost } } + +func proxyDialer(proxyURL *url.URL) (proxy.Dialer, error) { + if proxyURL.Scheme == "http" || proxyURL.Scheme == "https" { + // Create a new HTTP proxy dialer + httpProxyDialer := http_dialer.New(proxyURL) + return httpProxyDialer, nil + } else if proxyURL.Scheme == "socks5" { + // For SOCKS5 proxies, use the proxy package's FromURL + return proxy.FromURL(proxyURL, proxy.Direct) + } + return nil, fmt.Errorf("unsupported proxy scheme: %s", proxyURL.Scheme) +}