仅在HTTP / 2的TLS超时时缺少shutdown()回溯

时间:2018-06-11 16:32:03

标签: ssl twisted http2 django-channels daphne

我在测试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上进行了测试。

等几分钟,服务器就会回溯。

0 个答案:

没有答案