我正在尝试通过pycurl发出http2请求。我已经安装了libcurl需要的nghttp2 c库,我可以用curl做一个http2请求。
我用pycurl尝试了类似的东西:
import pycurl
import cStringIO
if __name__ == '__main__':
c = pycurl.Curl()
buf = cStringIO.StringIO()
c = pycurl.Curl()
c.setopt(c.URL, 'https://nghttp2.org')
c.setopt(pycurl.HTTP_VERSION, pycurl.VERSION_HTTP2)
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(pycurl.VERBOSE, 1)
c.perform()
buf.close()
我得到的输出是:
* Rebuilt URL to: https://nghttp2.org/
* Trying 106.186.112.116...
* Connected to nghttp2.org (106.186.112.116) port 443 (#0)
* Cipher selection: ALL:!EXPORT:!EXPORT40:!EXPORT56:!aNULL:!LOW:!RC4:@STRENGTH
* successfully set certificate verify locations:
* CAfile: /etc/ssl/certs/ca-certificates.crt
CApath: none
* NPN, negotiated HTTP1.1
* SSL connection using TLSv1.2 / ECDHE-RSA-AES256-GCM-SHA384
* Server certificate:
* subject: CN=nghttp2.org
* start date: Jan 21 22:58:00 2017 GMT
* expire date: Apr 21 22:58:00 2017 GMT
* subjectAltName: nghttp2.org matched
* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
* SSL certificate verify ok.
> GET / HTTP/1.1
Host: nghttp2.org
User-Agent: PycURL/7.43.0 libcurl/7.46.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 nghttp2/1.21.0-DEV librtmp/2.3
Accept: */*
Connection: Upgrade, HTTP2-Settings
Upgrade: h2c
HTTP2-Settings:
< HTTP/1.1 200 OK
< Date: Tue, 14 Mar 2017 13:33:48 GMT
< Content-Type: text/html
< Last-Modified: Sun, 26 Feb 2017 12:19:00 GMT
< Etag: "58b2c7b4-19e1"
< Accept-Ranges: bytes
< Content-Length: 6625
< X-Backend-Header-Rtt: 0.001418
< Strict-Transport-Security: max-age=31536000
< Server: nghttpx
< Via: 2 nghttpx
< x-frame-options: SAMEORIGIN
< x-xss-protection: 1; mode=block
< x-content-type-options: nosniff
<
* Connection #0 to host nghttp2.org left intact
我在这个请求中做错了什么?
编辑:
根据评论,我确保pycurl使用OpenSSL / 1.0.2k。现在User-Agent
标题如下所示:
User-Agent: PycURL/7.43.0 libcurl/7.46.0 OpenSSL/1.0.2k zlib/1.2.11 libidn/1.28 nghttp2/1.21.0-DEV librtmp/2.3
但我得到与上面相同的结果。
答案 0 :(得分:3)
似乎pycurl脚本使用了错误的http版本常量。正确的是c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_2_0)
。
答案 1 :(得分:1)
您在此处使用的libcurl版本标识它是使用OpenSSL / 1.0.1f构建的。 1.0.2之前的OpenSSL没有ALPN支持,而且是在大多数当前HTTPS站点上协商HTTP / 2所需的TLS扩展。 (有些人仍然支持较旧的NPN扩展,但它越来越少,特别是因为没有浏览器再使用NPN。)
据推测,你的curl命令行工具使用libcurl,你说是成功的,使用另一个安装?
最后,提供这些自定义标题可能只会冒险破坏您的操作而不是帮助它。当libcurl与站点协商HTTP / 2时,它会自动使用必要的标头。