119 lines
2.8 KiB
Go
119 lines
2.8 KiB
Go
package meilisearch
|
|
|
|
import (
|
|
"crypto/tls"
|
|
"net"
|
|
"net/http"
|
|
"time"
|
|
)
|
|
|
|
var (
|
|
defaultMeiliOpt = &meiliOpt{
|
|
client: &http.Client{
|
|
Transport: baseTransport(),
|
|
},
|
|
contentEncoding: &encodingOpt{
|
|
level: DefaultCompression,
|
|
},
|
|
retryOnStatus: map[int]bool{
|
|
502: true,
|
|
503: true,
|
|
504: true,
|
|
},
|
|
disableRetry: false,
|
|
maxRetries: 3,
|
|
}
|
|
)
|
|
|
|
type meiliOpt struct {
|
|
client *http.Client
|
|
apiKey string
|
|
contentEncoding *encodingOpt
|
|
retryOnStatus map[int]bool
|
|
disableRetry bool
|
|
maxRetries uint8
|
|
}
|
|
|
|
type encodingOpt struct {
|
|
encodingType ContentEncoding
|
|
level EncodingCompressionLevel
|
|
}
|
|
|
|
type Option func(*meiliOpt)
|
|
|
|
// WithCustomClient set custom http.Client
|
|
func WithCustomClient(client *http.Client) Option {
|
|
return func(opt *meiliOpt) {
|
|
opt.client = client
|
|
}
|
|
}
|
|
|
|
// WithCustomClientWithTLS client support tls configuration
|
|
func WithCustomClientWithTLS(tlsConfig *tls.Config) Option {
|
|
return func(opt *meiliOpt) {
|
|
trans := baseTransport()
|
|
trans.TLSClientConfig = tlsConfig
|
|
opt.client = &http.Client{Transport: trans}
|
|
}
|
|
}
|
|
|
|
// WithAPIKey is API key or master key.
|
|
//
|
|
// more: https://www.meilisearch.com/docs/reference/api/keys
|
|
func WithAPIKey(key string) Option {
|
|
return func(opt *meiliOpt) {
|
|
opt.apiKey = key
|
|
}
|
|
}
|
|
|
|
// WithContentEncoding support the Content-Encoding header indicates the media type is compressed by a given algorithm.
|
|
// compression improves transfer speed and reduces bandwidth consumption by sending and receiving smaller payloads.
|
|
// the Accept-Encoding header, instead, indicates the compression algorithm the client understands.
|
|
//
|
|
// more: https://www.meilisearch.com/docs/reference/api/overview#content-encoding
|
|
func WithContentEncoding(encodingType ContentEncoding, level EncodingCompressionLevel) Option {
|
|
return func(opt *meiliOpt) {
|
|
opt.contentEncoding = &encodingOpt{
|
|
encodingType: encodingType,
|
|
level: level,
|
|
}
|
|
}
|
|
}
|
|
|
|
// WithCustomRetries set retry on specific http error code and max retries (min: 1, max: 255)
|
|
func WithCustomRetries(retryOnStatus []int, maxRetries uint8) Option {
|
|
return func(opt *meiliOpt) {
|
|
opt.retryOnStatus = make(map[int]bool)
|
|
for _, status := range retryOnStatus {
|
|
opt.retryOnStatus[status] = true
|
|
}
|
|
|
|
if maxRetries == 0 {
|
|
maxRetries = 1
|
|
}
|
|
|
|
opt.maxRetries = maxRetries
|
|
}
|
|
}
|
|
|
|
// DisableRetries disable retry logic in client
|
|
func DisableRetries() Option {
|
|
return func(opt *meiliOpt) {
|
|
opt.disableRetry = true
|
|
}
|
|
}
|
|
|
|
func baseTransport() *http.Transport {
|
|
return &http.Transport{
|
|
Proxy: http.ProxyFromEnvironment,
|
|
DialContext: (&net.Dialer{
|
|
Timeout: 30 * time.Second,
|
|
KeepAlive: 30 * time.Second,
|
|
}).DialContext,
|
|
MaxIdleConns: 100,
|
|
MaxIdleConnsPerHost: 100,
|
|
IdleConnTimeout: 90 * time.Second,
|
|
TLSHandshakeTimeout: 10 * time.Second,
|
|
ExpectContinueTimeout: 1 * time.Second,
|
|
}
|
|
}
|