Files
Sillyv2/core/node_transport.go
cdle 05ffe94894 x
2023-06-14 20:50:09 +08:00

59 lines
1.7 KiB
Go

package core
import (
"encoding/base64"
"errors"
"net/http"
"net/url"
"strings"
"golang.org/x/net/proxy"
)
func GetTransport(proxyUrl string, user, password string) (*http.Transport, error) {
var auth *proxy.Auth
if user != "" || password != "" {
auth = &proxy.Auth{User: user, Password: password}
}
switch {
case strings.HasPrefix(proxyUrl, "socks5://"):
dialer, err := proxy.SOCKS5("tcp", strings.TrimPrefix(proxyUrl, "socks5://"), auth, proxy.Direct)
if err != nil {
return nil, err
}
return &http.Transport{Dial: dialer.Dial}, nil
case strings.HasPrefix(proxyUrl, "http://"):
proxyUrl = strings.TrimPrefix(proxyUrl, "http://")
url, err := url.Parse("http://" + proxyUrl)
if err != nil {
return nil, err
}
transport := &http.Transport{Proxy: http.ProxyURL(url)}
if auth != nil {
// Encode the credentials in Base64
authHeader := "Basic " + base64.StdEncoding.EncodeToString([]byte(user+":"+password))
transport.ProxyConnectHeader = http.Header{
"Proxy-Authorization": {authHeader},
}
}
return transport, nil
case strings.HasPrefix(proxyUrl, "https://"):
proxyUrl = strings.TrimPrefix(proxyUrl, "https://")
url, err := url.Parse("https://" + proxyUrl)
if err != nil {
return nil, err
}
transport := &http.Transport{Proxy: http.ProxyURL(url)}
if auth != nil {
// Encode the credentials in Base64
authHeader := "Basic " + base64.StdEncoding.EncodeToString([]byte(user+":"+password))
transport.ProxyConnectHeader = http.Header{
"Proxy-Authorization": {authHeader},
}
}
return transport, nil
default:
return nil, errors.New("proxy url schema error")
}
}