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

时间:2016-02-17 18:38:39

标签: c testing http2

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

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

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

1 个答案:

答案 0 :(得分:3)

由于您使用的是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)=[])