отсутствует трассировка shutdown () при тайм-ауте TLS только для HTTP / 2 - PullRequest
0 голосов
/ 11 июня 2018

Я столкнулся с этой проблемой во время тестирования django-каналов и 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, чтобы знать, является ли это ожидаемым поведением.Я что-то не так делаю или это ошибка?

Как воспроизвести

Установить Twisted с поддержкой HTTP / 2 и TLS

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-каналы, это 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.

Подождите несколько минут, и сервер выполнит трассировку.

...