Home > Back-end >  Why configures the ReadIdleTimeout HTTP/2 option for the transport on go1.16?
Why configures the ReadIdleTimeout HTTP/2 option for the transport on go1.16?

Time:10-21

From google api golang client, we notice that

google-api-go-client/transport/http/configure_http2_go116.go

//go:build go1.16
//  build go1.16

...
// configureHTTP2 configures the ReadIdleTimeout HTTP/2 option for the
// transport. This allows broken idle connections to be pruned more quickly,
// preventing the client from attempting to re-use connections that will no
// longer work.
func configureHTTP2(trans *http.Transport) {
    http2Trans, err := http2.ConfigureTransports(trans)
    if err == nil {
        http2Trans.ReadIdleTimeout = time.Second * 31
    }
}

Whereas in this file google-api-go-client/transport/http/configure_http2_not_go116.go

//go:build !go1.16
//  build !go1.16

// configureHTTP2 configures the ReadIdleTimeout HTTP/2 option for the
// transport. The interface to do this is only available in Go 1.16 and up, so
// this performs a no-op.
func configureHTTP2(trans *http.Transport) {}

Per net/http2/transport.go the ConfigureTransport was added long time before.

// ConfigureTransport configures a net/http HTTP/1 Transport to use HTTP/2.
// It returns an error if t1 has already been HTTP/2-enabled.
//
// Use ConfigureTransports instead to configure the HTTP/2 Transport.
func ConfigureTransport(t1 *http.Transport) error {

Why configures the ReadIdleTimeout HTTP/2 option for the transport on go1.16?

CodePudding user response:

There are two similar sounding functions in package golang.org/x/net/http2 with very different roles:

func ConfigureTransport  (t1 *http.Transport) error
func ConfigureTransports (t1 *http.Transport) (*Transport, error)

I think you are confusing the former with the latter.

From the issue tracker: https://go-review.googlesource.com/c/net/ /264017

The very similar names are unfortunate, but they'll sort next to each other in godoc and the pluralized ConfigureTransports hints at its purpose: it lets you configure both the http and http2 transports.

ConfigureTransports was only introduced exactly a year ago:

commit 08b38378de702b893ee869b94b32f833e2933bd2
Author: Damien Neil <[email protected]>
Date:   Tue Oct 20 12:34:04 2020 -0700

    http2: add ConfigureTransports
    
    The ConfigureTransport function doesn't provide any way to get at the
    http2 Transport it creates, making it impossible to configure transport
    parameters such as ReadIdleTimeout.
  • Related