From bb1c7970bd79ceb7bb0fa71e3fa2cdf61822ef72 Mon Sep 17 00:00:00 2001 From: niuhuan Date: Sat, 19 Mar 2022 13:54:16 +0800 Subject: [PATCH] Supported both DialContext and proxy --- go/pikapika/client.go | 59 ++++++++++++++++++++++++++++++++++--------- 1 file changed, 47 insertions(+), 12 deletions(-) diff --git a/go/pikapika/client.go b/go/pikapika/client.go index 1a4e1d3..ee1f139 100644 --- a/go/pikapika/client.go +++ b/go/pikapika/client.go @@ -7,6 +7,7 @@ import ( "encoding/json" "fmt" source "github.com/niuhuan/pica-go" + "golang.org/x/net/proxy" "net" "net/http" "net/url" @@ -47,13 +48,6 @@ var switchAddresses = map[int]string{ var switchAddress = 1 var switchAddressPattern, _ = regexp.Compile("^.+picacomic\\.com:\\d+$") -func switchAddressContext(ctx context.Context, network, addr string) (net.Conn, error) { - if sAddr, ok := switchAddresses[switchAddress]; ok { - addr = sAddr - } - return dialer.DialContext(ctx, network, addr) -} - func changeProxyUrl(urlStr string) bool { if urlStr == "" { client.Transport = &http.Transport{ @@ -61,19 +55,60 @@ func changeProxyUrl(urlStr string) bool { ExpectContinueTimeout: time.Second * 10, ResponseHeaderTimeout: time.Second * 10, IdleConnTimeout: time.Second * 10, - DialContext: switchAddressContext, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + if sAddr, ok := switchAddresses[switchAddress]; ok { + addr = sAddr + } + return dialer.DialContext(ctx, network, addr) + }, + } + imageHttpClient.Transport = &http.Transport{ + TLSHandshakeTimeout: time.Second * 10, + ExpectContinueTimeout: time.Second * 10, + ResponseHeaderTimeout: time.Second * 10, + IdleConnTimeout: time.Second * 10, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + return dialer.DialContext(ctx, network, addr) + }, } return false } client.Transport = &http.Transport{ - Proxy: func(_ *http.Request) (*url.URL, error) { - return url.Parse(urlStr) - }, TLSHandshakeTimeout: time.Second * 10, ExpectContinueTimeout: time.Second * 10, ResponseHeaderTimeout: time.Second * 10, IdleConnTimeout: time.Second * 10, - DialContext: switchAddressContext, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + proxyUrl, err := url.Parse(urlStr) + if err != nil { + return nil, err + } + proxy, err := proxy.FromURL(proxyUrl, proxy.Direct) + if err != nil { + return nil, err + } + if sAddr, ok := switchAddresses[switchAddress]; ok { + addr = sAddr + } + return proxy.Dial(network, addr) + }, + } + imageHttpClient.Transport = &http.Transport{ + TLSHandshakeTimeout: time.Second * 10, + ExpectContinueTimeout: time.Second * 10, + ResponseHeaderTimeout: time.Second * 10, + IdleConnTimeout: time.Second * 10, + DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { + proxyUrl, err := url.Parse(urlStr) + if err != nil { + return nil, err + } + proxy, err := proxy.FromURL(proxyUrl, proxy.Direct) + if err != nil { + return nil, err + } + return proxy.Dial(network, addr) + }, } return true }