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 更新以及何时使用