有没有办法让curl(命令行工具)保持http连接打开?我正在尝试测试/调试一个服务器应用程序,该应用程序有一个打开 http 连接的客户端,发出 PUT 请求并将其保持打开状态,直到采取进一步的操作,并且一直在尝试使用curl来模拟这一点。
但是,根据curl网站的说法:
但是,curl 命令行工具只能在运行期间保持连接处于活动状态,因此一旦它退出回命令行,它就必须关闭所有当前打开的连接。
这就很好了,但是有没有办法强制它不退出回命令行(直到我按任意键或 Ctrl-C 或它喜欢的任何键),从而在我进行测试时保持连接打开?
我已经尝试过
"Connection: keep-alive"
标头,但这并不能解决问题,该过程仍然会在发出请求后立即结束,并且连接会关闭。
如果没有,是否有替代工具可以做到这一点?
您可以“欺骗”curl 以保持连接打开。例如这样:
nc
监听本地端口,例如 8080(nc -l -p 8080
在某些版本的 nc 上)这将使curl在获取第二个URL时将第一个连接保留在其池中,并且您使第二个传输“无限期”挂起,这将使curl仅保持第一个连接打开并处于活动状态,直到您control-c该连接或您的数控加工。
另一种方法:
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 连接。