mirror of
https://github.com/songquanpeng/one-api.git
synced 2025-09-29 06:36:38 +08:00
62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package requester
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"net/http"
|
|
"net/url"
|
|
"one-api/common"
|
|
"time"
|
|
|
|
"github.com/gorilla/websocket"
|
|
"golang.org/x/net/proxy"
|
|
)
|
|
|
|
func GetWSClient(proxyAddr string) *websocket.Dialer {
|
|
dialer := &websocket.Dialer{
|
|
HandshakeTimeout: time.Duration(common.GetOrDefault("connect_timeout", 5)) * time.Second,
|
|
}
|
|
|
|
if proxyAddr != "" {
|
|
err := setWSProxy(dialer, proxyAddr)
|
|
if err != nil {
|
|
common.SysError(err.Error())
|
|
return dialer
|
|
}
|
|
}
|
|
|
|
return dialer
|
|
}
|
|
|
|
func setWSProxy(dialer *websocket.Dialer, proxyAddr string) error {
|
|
proxyURL, err := url.Parse(proxyAddr)
|
|
if err != nil {
|
|
return fmt.Errorf("error parsing proxy address: %w", err)
|
|
}
|
|
|
|
switch proxyURL.Scheme {
|
|
case "http", "https":
|
|
dialer.Proxy = http.ProxyURL(proxyURL)
|
|
case "socks5":
|
|
var auth *proxy.Auth = nil
|
|
password, isSetPassword := proxyURL.User.Password()
|
|
if isSetPassword {
|
|
auth = &proxy.Auth{
|
|
User: proxyURL.User.Username(),
|
|
Password: password,
|
|
}
|
|
}
|
|
socks5Proxy, err := proxy.SOCKS5("tcp", proxyURL.Host, auth, proxy.Direct)
|
|
if err != nil {
|
|
return fmt.Errorf("error creating socks5 dialer: %w", err)
|
|
}
|
|
dialer.NetDial = func(network, addr string) (net.Conn, error) {
|
|
return socks5Proxy.Dial(network, addr)
|
|
}
|
|
default:
|
|
return fmt.Errorf("unsupported proxy scheme: %s", proxyURL.Scheme)
|
|
}
|
|
|
|
return nil
|
|
}
|