accounts/server/proxy/proxy.go
2025-08-09 15:54:27 +08:00

46 lines
1.1 KiB
Go

package proxy
import (
"context"
gclient "github.com/go-git/go-git/v5/plumbing/transport/client"
ghttp "github.com/go-git/go-git/v5/plumbing/transport/http"
xproxy "golang.org/x/net/proxy"
"net"
"net/http"
"net/url"
)
// Set configures global HTTP and go-git clients to route through the given proxy URL.
// The proxyURL may be in formats like "http://host:port" or "socks5://host:port".
func Set(proxyURL string) {
if proxyURL == "" {
return
}
u, err := url.Parse(proxyURL)
if err != nil {
return
}
tr := http.DefaultTransport.(*http.Transport).Clone()
switch u.Scheme {
case "socks5", "socks5h":
dialer, err := xproxy.FromURL(u, xproxy.Direct)
if err != nil {
return
}
tr.Proxy = nil
if d, ok := dialer.(xproxy.ContextDialer); ok {
tr.DialContext = d.DialContext
} else {
tr.DialContext = func(ctx context.Context, network, addr string) (net.Conn, error) {
return dialer.Dial(network, addr)
}
}
default:
tr.Proxy = http.ProxyURL(u)
}
http.DefaultTransport = tr
c := &http.Client{Transport: tr}
gclient.InstallProtocol("https", ghttp.NewClient(c))
gclient.InstallProtocol("http", ghttp.NewClient(c))
}