如何发出pycurl http2请求?

2024-10-08 18:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图通过pycurl发出http2请求。我已经安装了libcurl需要的nghttp2c库,我可以用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()

我得到的输出是:

^{pr2}$

我在这个请求中做错了什么?在

编辑: 根据注释,我确保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但我得到了与上面相同的结果。在


Tags: importversioncurlagentpycurlopenssllibcurluser
2条回答

这里使用的libcurl版本表明它是用OpenSSL/1.0.1f构建的。OpenSSL在1.0.2之前不支持ALPN,这是在大多数当前HTTPS站点上协商HTTP/2所需的TLS扩展。(有些浏览器仍然支持旧的NPN扩展,但它越来越少,特别是因为没有浏览器使用NPN了。)

想必,您所说的curl命令行工具使用的libcurl是成功的,使用另一个安装?在

最后,提供您所做的那些定制头文件可能只会有破坏操作的风险,而不会对其有所帮助。当libcurl与站点协商HTTP/2时,它会自动使用必要的头。在

pycurl脚本似乎使用了错误的http版本常量。正确的是c.setopt(pycurl.HTTP_VERSION, pycurl.CURL_HTTP_VERSION_2_0)。在

相关问题 更多 >

    热门问题