curl 将数据发布到 HTTP/1.1,即使使用 APNs 的 http2 选项

Posted

技术标签:

【中文标题】curl 将数据发布到 HTTP/1.1,即使使用 APNs 的 http2 选项【英文标题】:curl posting data to HTTP/1.1 even with http2 option to APNs 【发布时间】:2018-01-17 23:06:51 【问题描述】:
curl  --http2  -i -v -d '"aps":"alert":"hello"' -H "apns-topic: xxxx" -H "authorization: bearer xxxxx"  https://api.development.push.apple.com/3/device/xxx

卷曲版本:

curl 7.46.0 (x86_64-pc-linux-gnu) libcurl/7.46.0 OpenSSL/1.0.1f zlib/1.2.8 libidn/1.28 nghttp2/1.25.0-DEV librtmp/2.3
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtmp rtsp smb smbs smtp smtps telnet tftp
Features: IDN IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets

发布:

POST /3/device/xxxxx HTTP/1.1

错误:

@@uUnexpected HTTP/1.x request: POST /3/device/xxx

如果我用 http2 运行简单的 curl 就可以了

 curl --http2 -I https://nghttp2.org/
    HTTP/2.0 200

【问题讨论】:

【参考方案1】:

你的问题:OpenSSL/1.0.1f

此版本的 OpenSSL 不支持 ALPN,这是与 HTTPS 服务器协商 HTTP/2 所需的 TLS 扩展。为此,您需要 OpenSSL 1.0.2 或更高版本。

一些 HTTP/2 服务器(如 nghttp2.org)还允许使用 NPN 来协商 HTTP/2(最初用于 SPDY)——OpenSSL 1.0.1 支持这一点!但由于浏览器前段时间放弃了 NPN 支持,因此支持此功能的服务器数量可能会随着时间的推移而减少。

【讨论】:

Daniel,安装了 OpenSSL 1.0.2g 2016 年 3 月 1 日版本。仍然面临 HTTP 1.1 调用触发的相同错误。有什么线索吗? curl 还必须使用 OpenSSL 1.0.2 支持(重新)构建,你这样做了吗? 丹尼尔,谢谢。我试图(重新)构建并在下面出现错误,知道吗?使用 pkg-config 检查 libnghttp2 选项...没有配置:错误:指定了 --with-nghttp2 但找不到 libnghttp2 pkg-config 文件。 ./configure --with-nghttp2=/usr/local --with-ssl 这听起来像是一个完全不同的问题,你最好阅读 curl 文档,或者在 curl 邮件列表中询问

以上是关于curl 将数据发布到 HTTP/1.1,即使使用 APNs 的 http2 选项的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 CURL 请求 http/1.1?或者可能还有其他问题,不确定

为啥 curl 在 mac 上使用 HTTP/1.1 而不是 HTTP/2?

PayPal 最近的 TLS 1.2 / HTTP 1.1 更新以及何时使用

带有 CURL 的 HTTP2 给出“不支持的协议”

Nginx 是不是支持以明文形式从 http/1.1 升级 http/2 (h2c)

cURL 错误 28 即使 API 端工作,主机不接收数据?