54 lines
1.3 KiB
Go
54 lines
1.3 KiB
Go
|
package client
|
||
|
|
||
|
import (
|
||
|
"net"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
userAgentHeader = "User-Agent"
|
||
|
)
|
||
|
|
||
|
type predefinedHeaderTransport struct {
|
||
|
useragentName string
|
||
|
http.Transport
|
||
|
}
|
||
|
|
||
|
func (pht *predefinedHeaderTransport) RoundTrip(req *http.Request) (res *http.Response, err error) {
|
||
|
req.Close = pht.DisableKeepAlives
|
||
|
req.Header.Set(userAgentHeader, pht.useragentName)
|
||
|
res, err = pht.Transport.RoundTrip(req)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// NewRoundTripper returns a http.RoundTripper that has some tunable parameters.
|
||
|
func NewRoundTripper(
|
||
|
keepaliveDuration time.Duration,
|
||
|
connectTimeout time.Duration,
|
||
|
responseHeaderTimeout time.Duration,
|
||
|
idleConnectionTimeout time.Duration,
|
||
|
maxIdleConnections int,
|
||
|
serverName string,
|
||
|
) http.RoundTripper {
|
||
|
|
||
|
keepaliveDisabled := keepaliveDuration == 0
|
||
|
dialer := &net.Dialer{
|
||
|
Timeout: connectTimeout,
|
||
|
KeepAlive: keepaliveDuration,
|
||
|
}
|
||
|
|
||
|
return &predefinedHeaderTransport{
|
||
|
useragentName: serverName,
|
||
|
Transport: http.Transport{
|
||
|
DisableKeepAlives: keepaliveDisabled,
|
||
|
DisableCompression: true,
|
||
|
MaxIdleConnsPerHost: maxIdleConnections,
|
||
|
DialContext: dialer.DialContext,
|
||
|
MaxIdleConns: maxIdleConnections,
|
||
|
IdleConnTimeout: idleConnectionTimeout,
|
||
|
ResponseHeaderTimeout: responseHeaderTimeout,
|
||
|
},
|
||
|
}
|
||
|
}
|