我在运行Python hyper
库时遇到问题,该库增加了对HTTP/2
协议的支持。
在我的Fedora机器上,我使用pip
和pip3
安装它,以便在Python 2.7.8和Python 3.4.1中使用它。然后我复制了与twitter连接的测试脚本:
from hyper import HTTP20Connection
conn = HTTP20Connection('twitter.com:443')
conn.request('GET', '/')
resp = conn.getresponse()
print(resp.read())
我使用Python 2.7.8运行它并以错误结束:
[mn:/plib] 1 ‡ python hyper_test.py
Traceback (most recent call last):
File "hyper_test.py", line 4, in <module>
conn.request('GET', '/')
File "/usr/lib/python2.7/site-packages/hyper/http20/connection.py", line 149, in request
self.endheaders(message_body=body, final=True, stream_id=stream_id)
File "/usr/lib/python2.7/site-packages/hyper/http20/connection.py", line 310, in endheaders
self.connect()
File "/usr/lib/python2.7/site-packages/hyper/http20/connection.py", line 215, in connect
self._recv_cb()
File "/usr/lib/python2.7/site-packages/hyper/http20/connection.py", line 580, in _recv_cb
self._consume_single_frame()
File "/usr/lib/python2.7/site-packages/hyper/http20/connection.py", line 496, in _consume_single_frame
frame, length = Frame.parse_frame_header(header)
File "/usr/lib/python2.7/site-packages/hyper/http20/frame.py", line 52, in parse_frame_header
frame = FRAMES[type](stream_id)
KeyError: 80
它以Python 3.4.1的不同错误结束:
[mn:/plib] 1 ‡ python3 hyper_test.py
Traceback (most recent call last):
File "hyper_test.py", line 4, in <module>
conn.request('GET', '/')
File "/usr/lib/python3.4/site-packages/hyper/http20/connection.py", line 149, in request
self.endheaders(message_body=body, final=True, stream_id=stream_id)
File "/usr/lib/python3.4/site-packages/hyper/http20/connection.py", line 310, in endheaders
self.connect()
File "/usr/lib/python3.4/site-packages/hyper/http20/connection.py", line 204, in connect
sock = wrap_socket(sock, self.host)
File "/usr/lib/python3.4/site-packages/hyper/http20/tls.py", line 44, in wrap_socket
assert ssl_sock.selected_npn_protocol() in H2_NPN_PROTOCOLS
AssertionError
什么会导致我的环境出现此类问题?
答案 0 :(得分:3)
第一个问题是由超支持Python 2.7.8引起的。
这是因为标准库的SSL模块在Python 2.7.8中很糟糕,并且缺乏对我们需要的许多功能的支持,包括SSL上下文,NPN和ALPN。 PyOpenSSL旨在用来弥补差距,但是我的拉动请求为PyOpenSSL添加NPN和ALPN支持已经淹没了9个多月。
如果您想在Python 2.7中使用hyper,则需要使用版本2.7.9,其标准库SSL模块得到了极大的改进。
对于Python 3.4,该错误是因为Twitter未能与我们协商HTTP / 2。这有些出乎意料,因为今天早上它对我来说似乎对我很好。你有某种中级MITM代理吗?
我确实需要让错误更清楚,所以我认为这是一个错误:我会将它从断言更新为具有正确错误消息的异常。
答案 1 :(得分:1)
Per @lukasa
这是twitter.com中的已知错误。我申请的有点合适 这是一个通过Twitter的bug报告。