51 lines
1.1 KiB
Go
51 lines
1.1 KiB
Go
// Package auth 提供认证相关功能的 HTTP 客户端
|
||
package auth
|
||
|
||
import (
|
||
"net/http"
|
||
"net/url"
|
||
"sync/atomic"
|
||
"time"
|
||
)
|
||
|
||
// 全局 HTTP 客户端存储,支持运行时代理重配置
|
||
var httpClientStore atomic.Pointer[http.Client]
|
||
|
||
// httpClient 返回当前全局 auth HTTP 客户端
|
||
func httpClient() *http.Client {
|
||
return httpClientStore.Load()
|
||
}
|
||
|
||
func init() {
|
||
InitHttpClient("")
|
||
}
|
||
|
||
// buildAuthTransport 构建带可选代理的 Transport
|
||
func buildAuthTransport(proxyURL string) *http.Transport {
|
||
t := &http.Transport{
|
||
MaxIdleConns: 50,
|
||
MaxIdleConnsPerHost: 10,
|
||
IdleConnTimeout: 90 * time.Second,
|
||
DisableCompression: false,
|
||
ForceAttemptHTTP2: true,
|
||
}
|
||
if proxyURL != "" {
|
||
if u, err := url.Parse(proxyURL); err == nil {
|
||
t.Proxy = http.ProxyURL(u)
|
||
t.ForceAttemptHTTP2 = false
|
||
}
|
||
} else {
|
||
t.Proxy = http.ProxyFromEnvironment
|
||
}
|
||
return t
|
||
}
|
||
|
||
// InitHttpClient 初始化(或重新初始化)auth 模块的全局 HTTP 客户端
|
||
func InitHttpClient(proxyURL string) {
|
||
client := &http.Client{
|
||
Timeout: 30 * time.Second,
|
||
Transport: buildAuthTransport(proxyURL),
|
||
}
|
||
httpClientStore.Store(client)
|
||
}
|