使用纯http2(h2c)的扭曲Web服务器



Twisted支持http1+http2。如何通过TCP设置扭曲的http2服务器(既不是ALPN也不是协议升级(?

服务器应回答此查询:

curl --http2-prior-knowledge http://localhost:8000/

Twisted应该为您自动设置HTTP/2服务器。确保安装了twisted的http2模块。最简单的方法是使用pip:

pip install -U twisted[http2]

然而,我注意到有几次它并没有开箱即用地运行HTTP/2。我不得不卸载h2hyperhyperframe,然后重新安装它们。

pip uninstall h2 hyperframe hyper
pip install -U twisted[http2]

使用自签名证书,这里有一个小型kleinWeb服务器示例。

openssl genrsa -aes256 -passout pass:SuperSecretPassword -out server.key 4096
openssl req -new -key server.key -passin pass:SuperSecretPassword -out server.csr
# Common Name (e.g. server FQDN or YOUR name) []:localhost
openssl x509 -req -passin pass:SuperSecretPassword -days 365 -in server.csr -signkey server.key -out server.crt
openssl rsa -in server.key -out server_no_pass.key -passin pass:SuperSecretPassword
mv server_no_pass.key server.key
cat server.crt server.key > selfsigned.pem
rm server.crt server.csr server.key
from klein import route, run
@route("/")
def hello(req):
if req.clientproto == b"HTTP/2":
return "http2"
return "http1.1"
run(endpoint_description="ssl:8000:privateKey=selfsigned.pem")

更新

虽然这不是最佳实践,但并没有什么可以禁止您在非TLS连接上运行HTTP/2服务器。不过,我相信大多数浏览器都不支持非TLS HTTP/2服务器(至少我无法让Firefox和Chrome使用它(。Twisted也不适合你,所以这意味着你必须实现自己的服务器。遵循hyper-h2网站上的扭曲示例。然后用endpoints.TCP4ServerEndpoint替换endpoints.SSL4ServerEndpoint

# ...
endpoint = endpoints.TCP4ServerEndpoint(reactor, 8080, backlog=128)
endpoint.listen(H2Factory(root))
reactor.run()

最新更新