2024-12-28 12:26:36 +00:00
|
|
|
|
// Package restyclient for http client
|
|
|
|
|
package restyclient
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"crypto/tls"
|
|
|
|
|
"net"
|
|
|
|
|
"net/http"
|
|
|
|
|
"sync"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/go-resty/resty/v2"
|
|
|
|
|
"github.com/google/uuid"
|
|
|
|
|
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
const (
|
|
|
|
|
timeout = time.Second * 30
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
|
clientOnce sync.Once
|
|
|
|
|
silentClientOnce sync.Once
|
|
|
|
|
globalClient *resty.Client
|
|
|
|
|
globalSilentClient *resty.Client
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var dialer = &net.Dialer{
|
|
|
|
|
Timeout: 30 * time.Second,
|
|
|
|
|
KeepAlive: 30 * time.Second,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// defaultTransport default transport
|
|
|
|
|
var defaultTransport http.RoundTripper = &http.Transport{
|
|
|
|
|
DialContext: dialer.DialContext,
|
|
|
|
|
ForceAttemptHTTP2: true,
|
|
|
|
|
MaxIdleConns: 100,
|
|
|
|
|
IdleConnTimeout: 90 * time.Second,
|
|
|
|
|
TLSHandshakeTimeout: 10 * time.Second,
|
|
|
|
|
ExpectContinueTimeout: 1 * time.Second,
|
|
|
|
|
// NOCC:gas/tls(设计如此)
|
|
|
|
|
TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // nolint
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// New : 新建 Client, 设置公共参数,tracing 等; 每次新建,cookies不复用
|
|
|
|
|
func New() *resty.Client {
|
|
|
|
|
if globalClient == nil {
|
|
|
|
|
clientOnce.Do(func() {
|
|
|
|
|
globalClient = resty.New().
|
|
|
|
|
SetTransport(otelhttp.NewTransport(defaultTransport)).
|
|
|
|
|
SetTimeout(timeout).
|
|
|
|
|
SetCookieJar(nil).
|
|
|
|
|
SetDebugBodyLimit(1024).
|
|
|
|
|
OnAfterResponse(restyAfterResponseHook).
|
|
|
|
|
SetPreRequestHook(restyBeforeRequestHook).
|
|
|
|
|
OnError(restyErrHook).
|
2024-12-28 14:06:48 +00:00
|
|
|
|
SetHeader("User-Agent", "restyclient")
|
2024-12-28 12:26:36 +00:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return globalClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// silentNew 安静模式,只打印错误日志
|
|
|
|
|
func silentNew() *resty.Client {
|
|
|
|
|
if globalSilentClient == nil {
|
|
|
|
|
silentClientOnce.Do(func() {
|
|
|
|
|
globalSilentClient = resty.New().
|
|
|
|
|
SetTransport(otelhttp.NewTransport(defaultTransport)).
|
|
|
|
|
SetTimeout(timeout).
|
|
|
|
|
SetCookieJar(nil).
|
|
|
|
|
SetDebugBodyLimit(1024).
|
|
|
|
|
// OnAfterResponse(restyAfterResponseHook).
|
|
|
|
|
// SetPreRequestHook(restyBeforeRequestHook).
|
|
|
|
|
OnError(restyErrHook).
|
|
|
|
|
SetHeader("User-Agent", "envmgr-restyclient")
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
return globalSilentClient
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// R : New().R() 快捷方式, 已设置公共参数,tracing 等
|
|
|
|
|
func R() *resty.Request {
|
|
|
|
|
return New().R()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// SilentR : 安静模式,只打印错误日志 已设置公共参数,tracing 等, 只打印错误日志
|
|
|
|
|
func SilentR() *resty.Request {
|
|
|
|
|
return silentNew().R()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// GenRequestID 生产 request_id
|
|
|
|
|
func GenRequestID() string {
|
|
|
|
|
id, _ := uuid.NewRandom()
|
|
|
|
|
return id.String()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// WithRequestID 设置 request_id
|
|
|
|
|
func WithRequestID(ctx context.Context, id string) context.Context {
|
|
|
|
|
newCtx := context.WithValue(ctx, requestIDCtxKey, id)
|
|
|
|
|
return newCtx
|
|
|
|
|
}
|