python-3.x - 在 python 3 中请求 HTTP/2 切换协议(protocol)

标签 python-3.x ssl curl nginx http2

我正在尝试使用 python 3 脚本检查 http 服务是否支持 HTTP/2。 不幸的是,经过大量研究并在我的脚本上花费了大量时间后,我没有执行它。

这是我的:

import sys
import http.client as HttpClient

h2c = {
  "User-agent": 'python/' + str(sys.version.split()[0]),
  "Connection": "Upgrade, HTTP2-Settings",
  "Upgrade": "h2c",
  "HTTP2-Settings": "AAMAAABkAAQAAP__",
  "Accept": "*/*"
}

c = HttpClient.HTTPSConnection(ip, port) # IP and port given in arguments
c.request('HEAD', '/', None, h2c)
r = c.getresponse()
# Print result (see below)

我知道它存在hyper但我并不总是想要 SSL,目前无法使用 hyper

禁用证书验证

这是我在本地主机上运行的脚本示例:

➜  http2 git:(master) ✗ python3 main.py -i localhost -p 443

HEAD / HTTP/1.1
Host: localhost
Upgrade: h2c
User-agent: python/3.4.2
Accept: */*
Connection: Upgrade, HTTP2-Settings
HTTP2-Settings: AAMAAABkAAQAAP__

HTTP/1.1 200 OK
Server: nginx/1.9.12
Date: Tue, 22 Mar 2016 15:05:15 GMT
Content-Type: text/html
Content-Length: 867
Last-Modified: Mon, 21 Mar 2016 10:03:18 GMT
Connection: keep-alive
ETag: "56efc6e6-363"
Accept-Ranges: bytes

我检查过并在我的 nginx 服务器上启用了 HTTP/2(使用 curl --http2)

如果有人有想法强制服务器回复HTTP 101 ...

最佳答案

HTTP/2 可以通过两种方式协商:通过 ALPN 的 TLS 或通过明文 HTTP/1.1 升级。

您在这里所做的是两种方法的混合:您正在使用 TLS 连接并发送 HTTP/1.1 升级。

您应该做的是使用 TLS 连接,使用客户端支持的协议(protocol)列表指定 ALPN 扩展(在您的情况下,至少 h2),然后 - 如果服务器接受 HTTP/2 - 开始直接发送 HTTP/2 帧(不是 HTTP/1.1 升级)。

我不是 Python 专家,但可以指定 ALPN 协议(protocol),请参阅 herehere .

你还想看看other Python projects实现了 HTTP/2。

关于python-3.x - 在 python 3 中请求 HTTP/2 切换协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36158373/

相关文章:

python - 如何使用 MongoDB 在 Django 中的 request.user 中设置 User

python - 为什么 fillna 不能按预期模式工作

python - python 中条形图顶部的值

php - 我如何在 OSX 10.11.6 上使用 OpenSSL 而不是 SecureTransport 和 Apache PHP

linux - 如何通过 grep 响应找出有多少调用超时?

c++ - curllib POST 正文数据(如何?)

python - 如何用 Decimal 创建 Pandas 系列?

ios - 从 OSX 复制 p12 证书,应用程序在调用 Web API 时将使用该证书

ssl - OpenSSL,将 CRT 转换为 PEM

java - SSL 握手异常 : PKIX path building failed with Unable to find certificate chain