139 lines
2.6 KiB
Go
139 lines
2.6 KiB
Go
package httpclient
|
||
|
||
import (
|
||
"sync"
|
||
"time"
|
||
|
||
"gitea.bvbej.com/bvbej/base-golang/pkg/trace"
|
||
|
||
"go.uber.org/zap"
|
||
)
|
||
|
||
var (
|
||
cache = &sync.Pool{
|
||
New: func() any {
|
||
return &option{
|
||
header: make(map[string][]string),
|
||
}
|
||
},
|
||
}
|
||
)
|
||
|
||
// Mock 定义接口Mock数据
|
||
type Mock func() (body []byte)
|
||
|
||
// Option 自定义设置http请求
|
||
type Option func(*option)
|
||
|
||
type basicAuth struct {
|
||
username string
|
||
password string
|
||
}
|
||
|
||
type option struct {
|
||
ttl time.Duration
|
||
basicAuth *basicAuth
|
||
header map[string][]string
|
||
trace *trace.Trace
|
||
dialog *trace.Dialog
|
||
logger *zap.Logger
|
||
retryTimes int
|
||
retryDelay time.Duration
|
||
retryVerify RetryVerify
|
||
alarmTitle string
|
||
alarmObject AlarmObject
|
||
alarmVerify AlarmVerify
|
||
mock Mock
|
||
}
|
||
|
||
func (o *option) reset() {
|
||
o.ttl = 0
|
||
o.basicAuth = nil
|
||
o.header = make(map[string][]string)
|
||
o.trace = nil
|
||
o.dialog = nil
|
||
o.logger = nil
|
||
o.retryTimes = 0
|
||
o.retryDelay = 0
|
||
o.retryVerify = nil
|
||
o.alarmTitle = ""
|
||
o.alarmObject = nil
|
||
o.alarmVerify = nil
|
||
o.mock = nil
|
||
}
|
||
|
||
func getOption() *option {
|
||
return cache.Get().(*option)
|
||
}
|
||
|
||
func releaseOption(opt *option) {
|
||
opt.reset()
|
||
cache.Put(opt)
|
||
}
|
||
|
||
// WithTTL 本次http请求最长执行时间
|
||
func WithTTL(ttl time.Duration) Option {
|
||
return func(opt *option) {
|
||
opt.ttl = ttl
|
||
}
|
||
}
|
||
|
||
// WithHeader 设置http header,可以调用多次设置多对key-value
|
||
func WithHeader(key, value string) Option {
|
||
return func(opt *option) {
|
||
opt.header[key] = []string{value}
|
||
}
|
||
}
|
||
|
||
// WithBasicAuth 设置基础认证权限
|
||
func WithBasicAuth(username, password string) Option {
|
||
return func(opt *option) {
|
||
opt.basicAuth = &basicAuth{
|
||
username: username,
|
||
password: password,
|
||
}
|
||
}
|
||
}
|
||
|
||
// WithTrace 设置trace信息
|
||
func WithTrace(t trace.T) Option {
|
||
return func(opt *option) {
|
||
if t != nil {
|
||
opt.trace = t.(*trace.Trace)
|
||
opt.dialog = new(trace.Dialog)
|
||
}
|
||
}
|
||
}
|
||
|
||
// WithLogger 设置logger以便打印关键日志
|
||
func WithLogger(logger *zap.Logger) Option {
|
||
return func(opt *option) {
|
||
opt.logger = logger
|
||
}
|
||
}
|
||
|
||
// WithMock 设置 mock 数据
|
||
func WithMock(m Mock) Option {
|
||
return func(opt *option) {
|
||
opt.mock = m
|
||
}
|
||
}
|
||
|
||
// WithOnFailedAlarm 设置告警通知
|
||
func WithOnFailedAlarm(alarmTitle string, alarmObject AlarmObject, alarmVerify AlarmVerify) Option {
|
||
return func(opt *option) {
|
||
opt.alarmTitle = alarmTitle
|
||
opt.alarmObject = alarmObject
|
||
opt.alarmVerify = alarmVerify
|
||
}
|
||
}
|
||
|
||
// WithOnFailedRetry 设置失败重试
|
||
func WithOnFailedRetry(retryTimes int, retryDelay time.Duration, retryVerify RetryVerify) Option {
|
||
return func(opt *option) {
|
||
opt.retryTimes = retryTimes
|
||
opt.retryDelay = retryDelay
|
||
opt.retryVerify = retryVerify
|
||
}
|
||
}
|