我在测试 django-channels 和 daphne 时遇到了这个问题(但这个问题不是他们独有的)。
--- <exception caught here> ---
File "/Users/****/lib/python3.6/site-packages/twisted/internet/base.py", line 896, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/Users/****/lib/python3.6/site-packages/twisted/web/http.py", line 2288, in forceAbortClient
self.transport.abortConnection()
File "/Users/****/lib/python3.6/site-packages/twisted/protocols/tls.py", line 435, in abortConnection
self._shutdownTLS()
File "/Users/****/lib/python3.6/site-packages/twisted/protocols/tls.py", line 338, in _shutdownTLS
shutdownSuccess = self._tlsConnection.shutdown()
builtins.AttributeError: 'NoneType' object has no attribute 'shutdown'
只有在使用 HTTP/2 时才会出现这种情况。HTTP1.1 工作正常,我从来没有遇到过这样的问题。我做了一些调查,我注意到这self._tlsConnection.shutdown()
被称为 2x,一旦超时self._tlsConnection
被设置为None
,然后再次出于某种未知原因。我对 HTTP 标准不够了解,无法知道这是否是预期的行为。我做错了什么还是这是一个错误?
如何重现
安装带有 HTTP/2 和 TLS 支持的 Twisted
pip install -U twisted[http2,tls]
创建 TLS 证书
openssl genrsa -aes256 -passout pass:SuperSecretPassword -out server.key 2048
openssl req -new -key server.key -passin pass:SuperSecretPassword -out server.csr
openssl x509 -req -passin pass:SuperSecretPassword -days 1024 -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
创建一个简单的 TLS 服务器(它不是 django-channels,它是 klein,因为这个问题不是频道独有的)。这将启动一个服务器https://0.0.0.0:9999
from klein import route, run
@route('/')
def hello(request):
return 'hello'
run(endpoint_description='ssl:9999:interface=0.0.0.0:certKey=server.crt:privateKey=server.key')
在网络浏览器上,转到https://localhost:9999
。打开开发人员工具并导航到网络选项卡。启用该protocol
选项并确保它是HTTP/2.0
. 我已经在 Chrome 和 Firefox 上进行了测试。
等待几分钟,服务器将命中回溯。