| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package service
- import (
- "context"
- "fmt"
- "golang.org/x/net/proxy"
- "net"
- "net/http"
- "net/url"
- "one-api/common"
- "time"
- )
- 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
- }
- // NewProxyHttpClient 创建支持代理的 HTTP 客户端
- func NewProxyHttpClient(proxyURL string) (*http.Client, error) {
- if proxyURL == "" {
- return http.DefaultClient, nil
- }
- // 解析代理URL
- 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":
- // 创建 SOCKS5 代理拨号器
- dialer, err := proxy.SOCKS5("tcp", parsedURL.Host, nil, 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)
- }
- }
|