带有普通http2h2c的扭曲Web服务器

问题描述

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

服务器应回答以下查询

InputNumber

解决方法

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

pip install -U twisted[http2]

但是,我注意到它没有开箱即用运行HTTP / 2。我必须先卸载h2hyperhyperframe,然后重新安装它们。

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

使用自签名证书,这是一个小型klein网络服务器示例。

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也不会为您解决问题,因此这意味着您必须实现自己的服务器。遵循twisted example on the hyper-h2 site。然后将endpoints.SSL4ServerEndpoint替换为endpoints.TCP4ServerEndpoint

# ...

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