😺

Goのnet/http Client構造体のオプション

2021/10/28に公開

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

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

ExpectContinueTimeout

クライアントがこの要求で (おそらく大規模な) メッセージ本文を送信しようとしていることを受信者に通知し、 100 (Continue) 暫定応答を受信することを期待します。

Discussion