😺
Goのnet/http Client構造体のオプション
Client構造体
- net/httpでリクエストを生成するときはClient構造体を使用します
- この構造体に渡すべきオプションは以下
- Transport
- CheckRedirect
- Jar
- Timeout
type Client struct {
Transport RoundTripper
CheckRedirect func(req *Request, via []*Request) error
Jar CookieJar
Timeout time.Duration
}
Transport
- このフィールドは
RoundTripper interface
となっており - 実はRoundTripメソッドを実装してさえいれば渡せる
type RoundTripper interface {
RoundTrip(*Request) (*Response, error)
}
defaultのTransport
- 例えば
http.Get
の場合は - DefaultClientが使われていて
- 最終的にDoが呼ばれてsendの中でDefaultTransportが設定される
var DefaultTransport RoundTripper = &Transport{
Proxy: ProxyFromEnvironment,
DialContext: (&net.Dialer{
Timeout: 30 * time.Second,
KeepAlive: 30 * time.Second,
}).DialContext,
ForceAttemptHTTP2: true,
MaxIdleConns: 100,
IdleConnTimeout: 90 * time.Second,
TLSHandshakeTimeout: 10 * time.Second,
ExpectContinueTimeout: 1 * time.Second,
}
Proxy
- ProxyFromEnvironmentでセットされる
func ProxyFromEnvironment(req *Request) (*url.URL, error) {
return envProxyFunc()(req.URL)
}
- 環境変数のHTTP_PROXYから取得している
func FromEnvironment() *Config {
return &Config{
HTTPProxy: getEnvAny("HTTP_PROXY", "http_proxy"),
HTTPSProxy: getEnvAny("HTTPS_PROXY", "https_proxy"),
NoProxy: getEnvAny("NO_PROXY", "no_proxy"),
CGI: os.Getenv("REQUEST_METHOD") != "",
}
}
DialContext
- DialerからDialContextを生成している
- TimeoutやKeepaliveの設定に利用されている
type Dialer struct {
Timeout time.Duration
Deadline time.Time
LocalAddr Addr
DualStack bool
FallbackDelay time.Duration
KeepAlive time.Duration
Resolver *Resolver
Cancel <-chan struct{}
Control func(network, address string, c syscall.RawConn) error
}
func (d *Dialer) DialContext(ctx context.Context, network, address string) (Conn, error)
type Conn interface {
Read(b []byte) (n int, err error)
Write(b []byte) (n int, err error)
Close() error
LocalAddr() Addr
RemoteAddr() Addr
SetDeadline(t time.Time) error
SetReadDeadline(t time.Time) error
SetWriteDeadline(t time.Time) error
}
ForceAttemptHTTP2
- http2を使用するためのフラグ
- Defaultでtrueになっているので有効化されている
MaxIdleConns
- IdleConnectionをデフォルトで100に設定している
- コネクションプールの最大値
IdleConnTimeout
- 90秒でプールされているコネクションをTimeoutさせる
90 * time.Second
TLSHandshakeTimeout
- https://engineers.fenrir-inc.com/entry/2018/11/12/153859
- TLSハンドシェイクのTimeout設定
- 10秒に設定されている
ExpectContinueTimeout
- https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Expect
- Expectヘッダーの設定でサーバー側に選択の余地を与える
クライアントがこの要求で (おそらく大規模な) メッセージ本文を送信しようとしていることを受信者に通知し、
100
(Continue) 暫定応答を受信することを期待します。
Discussion