| | package service |
| |
|
| | import ( |
| | "context" |
| | "fmt" |
| | "net" |
| | "net/http" |
| | "net/url" |
| | "one-api/common" |
| | "time" |
| |
|
| | "golang.org/x/net/proxy" |
| | ) |
| |
|
| | var httpClient *http.Client |
| | var impatientHTTPClient *http.Client |
| |
|
| | func init() { |
| | if common.RelayTimeout == 0 { |
| | httpClient = &http.Client{} |
| | } else { |
| | httpClient = &http.Client{ |
| | Timeout: time.Duration(common.RelayTimeout) * time.Second, |
| | } |
| | } |
| |
|
| | impatientHTTPClient = &http.Client{ |
| | Timeout: 5 * time.Second, |
| | } |
| | } |
| |
|
| | func GetHttpClient() *http.Client { |
| | return httpClient |
| | } |
| |
|
| | func GetImpatientHttpClient() *http.Client { |
| | return impatientHTTPClient |
| | } |
| |
|
| | |
| | func NewProxyHttpClient(proxyURL string) (*http.Client, error) { |
| | if proxyURL == "" { |
| | return http.DefaultClient, nil |
| | } |
| |
|
| | parsedURL, err := url.Parse(proxyURL) |
| | if err != nil { |
| | return nil, err |
| | } |
| |
|
| | switch parsedURL.Scheme { |
| | case "http", "https": |
| | return &http.Client{ |
| | Transport: &http.Transport{ |
| | Proxy: http.ProxyURL(parsedURL), |
| | }, |
| | }, nil |
| |
|
| | case "socks5", "socks5h": |
| | |
| | var auth *proxy.Auth |
| | if parsedURL.User != nil { |
| | auth = &proxy.Auth{ |
| | User: parsedURL.User.Username(), |
| | Password: "", |
| | } |
| | if password, ok := parsedURL.User.Password(); ok { |
| | auth.Password = password |
| | } |
| | } |
| |
|
| | |
| | |
| | dialer, err := proxy.SOCKS5("tcp", parsedURL.Host, auth, proxy.Direct) |
| | if err != nil { |
| | return nil, err |
| | } |
| |
|
| | return &http.Client{ |
| | Transport: &http.Transport{ |
| | DialContext: func(ctx context.Context, network, addr string) (net.Conn, error) { |
| | return dialer.Dial(network, addr) |
| | }, |
| | }, |
| | }, nil |
| |
|
| | default: |
| | return nil, fmt.Errorf("unsupported proxy scheme: %s", parsedURL.Scheme) |
| | } |
| | } |
| |
|