Python`hyper`库不适用于我的环境

时间:2015-03-11 15:38:01

标签: python http ssl http2

我在运行Python hyper库时遇到问题,该库增加了对HTTP/2协议的支持。

在我的Fedora机器上,我使用pippip3安装它,以便在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

什么会导致我的环境出现此类问题?

2 个答案:

答案 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报告。

https://github.com/Lukasa/hyper/issues/84