😺
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)
}
CheckRedirectフィールド
Requestした際にRedirectをどれだけ許容するかの設定をするところ。細かい所は省くがnilの場合は10回まで許容する。
Jarフィールド
Cookieを送るかどうかの設定。無い場合はリクエストで明示的に送信しない限りは送らない。
Timeoutフィールド
リクエストを行う制限時間の設定。0の場合はタイムアウトしない。
DefaultTransportとは
TransportにはDefaultTransportと言う物があります。例えばhttp.Get
の場合は
このDefaultClientが使われていて、最終的にDoが呼ばれてsendの中でDefaultTransportが設定される
- https://pkg.go.dev/net/http#RoundTripper
- https://cs.opensource.google/go/go/+/master:src/net/http/transport.go
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