😺

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)
}

CheckRedirectフィールド

Requestした際にRedirectをどれだけ許容するかの設定をするところ。細かい所は省くがnilの場合は10回まで許容する。

Jarフィールド

Cookieを送るかどうかの設定。無い場合はリクエストで明示的に送信しない限りは送らない。

Timeoutフィールド

リクエストを行う制限時間の設定。0の場合はタイムアウトしない。

DefaultTransportとは

TransportにはDefaultTransportと言う物があります。例えば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フィールド

ExpectContinueTimeoutフィールド

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

Discussion