作为我学习的一部分,我决定编写一个能够简单地提供静态文件的HTTP / 2服务器。我必须用C编写它,我很少有经验,所以我决定使用h2c
(使用TCP),而不是h2
(使用TLS)。我需要一些工具来测试我的服务器,但我不能同时使用Chrome和Firefox,因为它们都只支持h2
。
测试服务器的最简单方法是什么?也许有一些h2c
实现其他语言,比如python或js(node),在那里我可以快速组装一个测试客户端?
我仍然考虑实施h2
,如果没有出现,但在查看this OpenSSL TLS client example之后,我有点害怕,因为它只是一个简单的GET
,其大小是4倍我到目前为止编写的代码。
答案 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)=[])