Support using proxy dial-up connection to GitHub.

This commit is contained in:
三千 2025-02-09 21:41:55 +08:00
parent f5c32915b9
commit c7aea91c43
8 changed files with 80 additions and 9 deletions

View file

@ -22,9 +22,9 @@ var (
BufferPool *sync.Pool
)
func InitReq() {
initChunkedHTTPClient()
initGitHTTPClient()
func InitReq(cfg *config.Config) {
initChunkedHTTPClient(cfg)
initGitHTTPClient(cfg)
// 初始化固定大小的缓存池
BufferPool = &sync.Pool{
@ -34,7 +34,7 @@ func InitReq() {
}
}
func initChunkedHTTPClient() {
func initChunkedHTTPClient(cfg *config.Config) {
ctr = &http.Transport{
MaxIdleConns: 100,
MaxConnsPerHost: 60,
@ -47,6 +47,7 @@ func initChunkedHTTPClient() {
KeepAlive: 30 * time.Second,
}).DialContext,
}
initTransport(cfg, ctr)
cclient = &http.Client{
Transport: ctr,
}

55
proxy/dial.go Normal file
View file

@ -0,0 +1,55 @@
package proxy
import (
"ghproxy/config"
"net/http"
"net/url"
"strings"
"golang.org/x/net/proxy"
)
func newProxyDial(prxoyUrls string) proxy.Dialer {
var proxyDialer proxy.Dialer = proxy.Direct
for _, prxoyUrl := range strings.Split(prxoyUrls, ",") {
urlInfo, err := url.Parse(prxoyUrl)
if err != nil {
return proxyDialer
}
var auth *proxy.Auth = nil
if urlInfo.User != nil {
pwd, _ := urlInfo.User.Password()
auth = &proxy.Auth{
User: urlInfo.User.Username(),
Password: pwd,
}
}
dialer, err := proxy.SOCKS5("tcp", urlInfo.Host, auth, proxyDialer)
if err == nil {
proxyDialer = dialer
}
}
return proxyDialer
}
func initTransport(cfg *config.Config, transport *http.Transport) {
if !cfg.Proxy.Enabled {
return
}
if cfg.Proxy.Url == "" {
transport.Proxy = http.ProxyFromEnvironment
return
}
proxyInfo, err := url.Parse(cfg.Proxy.Url)
if err == nil {
if strings.HasPrefix(cfg.Proxy.Url, "http") {
transport.Proxy = http.ProxyURL(proxyInfo)
} else {
proxyDialer := newProxyDial(cfg.Proxy.Url)
transport.Dial = proxyDialer.Dial
transport.DialContext = proxyDialer.(proxy.ContextDialer).DialContext
}
}
}

View file

@ -17,12 +17,13 @@ var (
gtr *http.Transport
)
func initGitHTTPClient() {
func initGitHTTPClient(cfg *config.Config) {
gtr = &http.Transport{
MaxIdleConns: 30,
MaxConnsPerHost: 30,
IdleConnTimeout: 30 * time.Second,
}
initTransport(cfg, gtr)
gclient = &http.Client{
Transport: gtr,
}