如何在 curl 中使用 HTTP/2 的推送功能?

Posted

技术标签:

【中文标题】如何在 curl 中使用 HTTP/2 的推送功能?【英文标题】:How to use HTTP/2's pushing features with curl? 【发布时间】:2015-02-12 19:20:54 【问题描述】:

我一直在寻找使用 HTTP/2 推送功能的方法,以减少发出的 GET 请求的数量和特定客户端-服务器实现中的平均感知延迟。现有的客户端严重依赖使用 curl 来发出 GET 请求,我需要能够重用当前的实现。最新版本的 curl 提供对 HTTP/2 的支持,依赖于底层的 nghttp2 模块。使用现有的 nghttp2 服务器:

nghttpd -d /var/www/html/ 3000 local.key local.crt

nghttp 和 curl 都可以用来获取示例文本文件的内容:

nghttp https://localhost:3000/text.txt
This is some sample text.

curl https://localhost:3000/text.txt -k --http2
This is some sample text.

然而,使用 nghttp2 的推送功能,另一个文本文件被推送:

nghttpd -d /var/www/html/ -p/text.txt=/text2.txt 3000 local.key local.crt

curl 似乎无法处理推送的资源:

nghttp https://localhost:3000/bbb/text.txt
This is some sample text.
This is some sample text as well.

curl https://localhost:3000/text.txt -k --http2 -v
...
* nghttp2_session_mem_recv() returns 268
* before_frame_send() was called
* on_frame_send() was called
* on_stream_close() was called, error_code = 1
* before_frame_send() was called
* on_frame_send() was called
* on_stream_close() was called, error_code = 1
* Connection #0 to host localhost left intact

确实,在服务器端,为两个打开的流接收到两个重置:

[id=1] [331.593] recv RST_STREAM frame <length=4, flags=0x00, stream_id=1>
      (error_code=PROTOCOL_ERROR(0x01))
[id=1] [331.594] recv RST_STREAM frame <length=4, flags=0x00, stream_id=2>
      (error_code=PROTOCOL_ERROR(0x01))
[id=1] [331.594] closed

有没有办法将 curl 与 HTTP/2 推送功能一起使用?

【问题讨论】:

【参考方案1】:

curl(命令行工具)还不支持 HTTP/2 推送。

您只能在使用 libcurl 而不是命令行工具执行 HTTP/2 时使用它。

【讨论】:

curl 从今天开始支持 HTTP/2 推送吗? @ldclakmal 我认为确实如此:curl.se/docs/http2.html 我确认我的一些安装(pi3 上的 7.52.1)它也获取推送的资源。在其他一些上虽然没有(例如 Ubuntu 20 上的 7.68.0,或 Windows 上的 7.76.0),所以我不确定那里发生了什么。 curl,命令行工具,仍然不支持HTTP/2推送。

以上是关于如何在 curl 中使用 HTTP/2 的推送功能?的主要内容,如果未能解决你的问题,请参考以下文章

如何在curl php中发送推送通知时获取注册ID

使用 curl 命令发送推送通知时出现无效注册错误

百度站长工具链接提交主动推送怎么用

如何在 HTTP/1.1 中使用 PHP cURL

[使用.p8文件在php中发送iOS推送通知

如何通过 GCM 向 iOS 设备发送推送通知?