cURL 命令行保持连接打开

问题描述 投票:0回答:2

有没有办法让curl(命令行工具)保持http连接打开?我正在尝试测试/调试一个服务器应用程序,该应用程序有一个打开 http 连接的客户端,发出 PUT 请求并将其保持打开状态,直到采取进一步的操作,并且一直在尝试使用curl来模拟这一点。

但是,根据curl网站的说法:

但是,curl 命令行工具只能在运行期间保持连接处于活动状态,因此一旦它退出回命令行,它就必须关闭所有当前打开的连接。

这就很好了,但是有没有办法强制它不退出回命令行(直到我按任意键或 Ctrl-C 或它喜欢的任何键),从而在我进行测试时保持连接打开?

我已经尝试过

"Connection: keep-alive"
标头,但这并不能解决问题,该过程仍然会在发出请求后立即结束,并且连接会关闭。

如果没有,是否有替代工具可以做到这一点?

http curl
2个回答
24
投票

您可以“欺骗”curl 以保持连接打开。例如这样:

  1. 启动
    nc
    监听本地端口,例如 8080(
    nc -l -p 8080
    在某些版本的 nc 上)
  2. 运行curl以获取所需的资源,然后在同一命令行上添加“localhost:8080”作为第二个URL

这将使curl在获取第二个URL时将第一个连接保留在其池中,并且您使第二个传输“无限期”挂起,这将使curl仅保持第一个连接打开并处于活动状态,直到您control-c该连接或您的数控加工。


0
投票

另一种方法:

HTTP/1.1 定义默认情况下 Web 服务器在向客户端发送 HTTP 应答后不需要关闭底层 TCP 连接。所以问题的根源是curl本身作为http客户端。它根据自己的决定关闭 tcp 连接。 如果我们使用 nc 作为 HTTP 客户端,就不会出现这样的问题。

使用 HTTP 请求创建 txt 文件:

$ cat http.txt 
GET / HTTP/1.1
Host: example.ex
Connection: keep-alive

通过 nc:

发出 HTTP 请求
$ nc 127.0.0.1 8888 <  http.txt 
HTTP/1.1 200 OK
Server: nginx/1.26.2
..
..

nc 不会关闭 tcp 连接。
让我们检查一下。
检查 nginx

  $ sudo lsof -Pn -p  1792527   2>/dev/null | grep -E "FD|TCP"
COMMAND     PID USER  FD      TYPE             DEVICE SIZE/OFF      NODE NAME
nginx   1792527 http   3u     IPv4           21823528      0t0       TCP 127.0.0.1:8888->127.0.0.1:37152 (ESTABLISHED)
nginx   1792527 http   5u     IPv4           12351541      0t0       TCP 127.0.0.1:8888 (LISTEN)

检查NC

$ lsof -nP -p $(pidof nc) | grep -E "FD|TCP"
COMMAND     PID   USER  FD   TYPE   DEVICE SIZE/OFF      NODE NAME
nc      1939845 noroot   3u  IPv4 21820777      0t0       TCP 127.0.0.1:37152->127.0.0.1:8888 (ESTABLISHED)

所以我们看到 nc 和 nginx 之间建立了完全相同的 tcp 连接。
默认情况下,如果在该时间间隔内没有任何其他 HTTP 请求,nginx 会在 60 秒后关闭 tcp 连接。

© www.soinside.com 2019 - 2024. All rights reserved.