测试我的 h2c 实现的简单工具

Simple tool to test my h2c implementation

作为学习的一部分,我决定编写一个 HTTP/2 能够简单地提供静态文件服务的服务器。我必须用 C 语言编写它,我对它的经验很少,所以我决定使用 h2c(使用 TCP),而不是 h2(使用 TLS)。我需要一些工具来测试我的服务器,但我既不能使用 Chrome,也不能使用 Firefox,因为它们都只支持 h2.

测试我的服务器最简单的方法是什么?也许有一些 h2c 其他语言的实现,比如 python 或 js(节点),我可以在那里快速 assemble 一个测试客户端?

我还在考虑实现h2,如果没有,但是看了this OpenSSL TLS client example,我有点害怕,因为它只是一个简单的GET,它的大小是到目前为止我编写的代码的 4 倍。

由于您使用 C 语言工作,因此您可以使用 nghttp2 来测试您的 h2c 实现。

我刚刚针对 Jetty HTTP/2 服务器进行了测试,这是输出:

$ nghttp -v http://localhost:8080
[  0.000] send SETTINGS frame <length=12, flags=0x00, stream_id=0>
      (niv=2)
      [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.000] send HEADERS frame <length=33, flags=0x05, stream_id=1>
      ; END_STREAM | END_HEADERS
      (padlen=0)
      ; Open new stream
      :authority: localhost:8080
      :method: GET
      :path: /
      :scheme: http
      accept: */*
      accept-encoding: gzip, deflate
      user-agent: nghttp2/0.6.7
[  0.104] recv SETTINGS frame <length=12, flags=0x00, stream_id=0>
      (niv=2)
      [SETTINGS_HEADER_TABLE_SIZE(0x01):4096]
      [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[  0.104] send SETTINGS frame <length=0, flags=0x01, stream_id=0>
      ; ACK
      (niv=0)
[  0.105] recv SETTINGS frame <length=0, flags=0x01, stream_id=0>
      ; ACK
      (niv=0)
[  0.121] recv (stream_id=1, noind=0) :status: 200
[  0.121] recv (stream_id=1, noind=0) server: Jetty(9.3.z-SNAPSHOT)
[  0.121] recv (stream_id=1, noind=0) date: Wed, 17 Feb 2016 19:11:17 GMT
[  0.121] recv (stream_id=1, noind=0) custom: Value
[  0.121] recv (stream_id=1, noind=0) content-type: text/plain
[  0.121] recv (stream_id=1, noind=0) content-length: 72
[  0.121] recv HEADERS frame <length=70, flags=0x04, stream_id=1>
      ; END_HEADERS
      (padlen=0)
      ; First response header
Hello from Jetty using HTTP/2.0
uri=/
date=Wed Feb 17 20:11:17 CET 2016
[  0.121] recv DATA frame <length=72, flags=0x01, stream_id=1>
      ; END_STREAM
[  0.121] send GOAWAY frame <length=8, flags=0x00, stream_id=0>
      (last_stream_id=0, error_code=NO_ERROR(0x00), opaque_data(0)=[])