在Golang的httptest中使用HTTP2

Golang在Go1.6中添加了对HTTP2的支持。而在预计于2017年2月发布的Go1.8中,还新增了用于进行Server Push的方法(关于使用方法可参考《HTTP/2 Server Push · Go, the unwritten parts》)。预计未来Golang中对HTTP2的使用将进一步增加。随着使用HTTP2的应用增加,相关测试也将变得更加重要。

在Go1.6中,HTTP2支持被很好地支持了,而无需对API进行更改。在服务器端,只需使用ListenAndServeTLS来启用h2,而客户端则可以使用DefaultClient。当在Golang中进行服务器测试时,通常会使用httptest包,但使用起来并不是那么简单。需要稍微设置一下,如下所示。

func TestHTTP2Server(t *testing.T) {
    ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.WriteHeader(http.StatusOK)
    }))

    if err := http2.ConfigureServer(ts.Config, nil); err != nil {
        t.Fatalf("Failed to configure h2 server: %s", err)
    }
    ts.TLS = ts.Config.TLSConfig
    ts.StartTLS()

    tr := &http.Transport{
        TLSClientConfig: &tls.Config{
            InsecureSkipVerify: true,
        },
    }

    if err := http2.ConfigureTransport(tr); err != nil {
        t.Fatalf("Failed to configure h2 transport: %s", err)
    }

    client := &http.Client{
        Transport: tr,
    }

    res, err := client.Get(ts.URL)
    if err != nil {
        t.Fatalf("err: %s", err)
    }
    defer res.Body.Close()

    t.Logf("is HTTP2: %v (%s)\n", res.ProtoAtLeast(2, 0), res.Proto)
}

准备 httptest.Server 和 http.Transport(需要 InsecureSkipVerify),需要调用 http2.ConfigureServer 和 http2.ConfigureTransport。 这将完成 h2 协商所需的配置,包括 NextProtos 等。

Golang的HTTP2包目前仍在golang.org/x/net/http2进行开发,并在发布时通过一个名为bundle的强力命令将其纳入到标准的net/http中。主要的测试在x中进行,但net/http中也有关于h2的测试。在这里,也使用了本次介绍的测试方法来编写测试(参考)。

顺便提一句,通过http.Client是无法接收到Server Push的。为了进行测试,需要努力编写代码以解析帧等等…

广告
将在 10 秒后关闭
bannerAds