blob: 83993c6d76ca060f57afafc484da37561a759c5b [file] [edit]
// Copyright 2026 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package http2_test
import (
"crypto/tls"
"io"
"net/http"
"net/http/httptest"
"testing"
. "golang.org/x/net/http2"
)
// TestConfigureTransportEnablesHTTP2 verifies that ConfigureTransport and
// ConfigureTransports enable HTTP/2 on a transport with a custom TLSClientConfig.
// net/http does not auto-enable HTTP/2 for such a transport, so without
// ConfigureTransport doing so the request is sent over HTTP/1 to an HTTP/2
// server. The test is intentionally not build-tagged: the behavior must hold for
// the legacy implementation (transport.go) and the go1.27 net/http wrapper
// (transport_wrap.go) alike.
func TestConfigureTransportEnablesHTTP2(t *testing.T) {
for _, tc := range []struct {
name string
configure func(*http.Transport) error
}{
{"ConfigureTransport", ConfigureTransport},
{"ConfigureTransports", func(t1 *http.Transport) error {
_, err := ConfigureTransports(t1)
return err
}},
} {
t.Run(tc.name, func(t *testing.T) {
ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, r.Proto)
}))
if err := ConfigureServer(ts.Config, &Server{}); err != nil {
t.Fatal(err)
}
ts.TLS = ts.Config.TLSConfig
ts.StartTLS()
defer ts.Close()
// A custom TLSClientConfig disables net/http's automatic HTTP/2;
// ConfigureTransport is responsible for re-enabling it.
tr := &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}}
if err := tc.configure(tr); err != nil {
t.Fatal(err)
}
res, err := (&http.Client{Transport: tr}).Get(ts.URL)
if err != nil {
t.Fatalf("Get: %v", err)
}
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
if res.ProtoMajor != 2 {
t.Errorf("request negotiated %s (server saw %q); want HTTP/2", res.Proto, body)
}
})
}
}