Skip to content

Instantly share code, notes, and snippets.

@elindsey
Created December 12, 2023 16:11
Show Gist options
  • Save elindsey/0a98a3784fb059fd4458afe70b7737ee to your computer and use it in GitHub Desktop.
Save elindsey/0a98a3784fb059fd4458afe70b7737ee to your computer and use it in GitHub Desktop.
package http2_test
import (
"crypto/tls"
"crypto/x509"
"net/http"
"net/http/httptest"
"testing"
"time"
"golang.org/x/net/http2"
)
func getMux(t *testing.T) *http.ServeMux {
// define our http handler
mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
t.Logf("received request: %+v", r)
w.WriteHeader(http.StatusOK)
_, _ = w.Write([]byte("foo bar!"))
})
return mux
}
func TestMakeHTTPConnection(t *testing.T) {
// start an http1.1 server
srv := httptest.NewUnstartedServer(getMux(t))
srv.EnableHTTP2 = true
srv.Start()
defer srv.Close()
// create a http1.1 client
transport := http.DefaultTransport.(*http.Transport).Clone()
httpClient := http.DefaultClient
httpClient.Transport = transport
// perform http1 request
_, err := httpClient.Get(srv.URL)
if err != nil {
t.Errorf("error while performing http1 request: %s", err.Error())
}
}
func TestMakeHTTP2Connection(t *testing.T) {
// start an http2 server
srv := httptest.NewUnstartedServer(getMux(t))
srv.EnableHTTP2 = true
srv.StartTLS() // also tried srv2.Start() but this does not work either
defer srv.Close()
transport := http.DefaultTransport.(*http.Transport).Clone()
// add httptest server's self-signed cert
certpool := x509.NewCertPool()
certpool.AddCert(srv.Certificate())
tlsconf := &tls.Config{RootCAs: certpool}
transport.TLSClientConfig = tlsconf
http2Transport, err := http2.ConfigureTransports(transport)
if err != nil {
t.Errorf("error while configuring http2 transport: %s", err.Error())
return
}
http2Transport.ReadIdleTimeout = time.Second * 1 // ping is performed at N whenever no frame was received in the meantime
http2Transport.PingTimeout = time.Second * 3 // after what time a ping is considered timed out
http2Client := http.DefaultClient
http2Client.Transport = transport
// perform http2 request
_, err = http2Client.Get(srv.URL)
if err != nil {
t.Errorf("error while performing http2 request: %s", err.Error())
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment