使用'Connection:close'的CURL请求无法加载所有内容

时间:2014-12-22 18:55:33

标签: curl nginx tcp http-headers

我有一台服务器默认使用" chunked"发送HTTP / 1.1响应数据。但是,当我使用"连接时关闭该服务器:关闭"那么它似乎只报告了前3-4千字节的数据。

我有发送该标题的客户端 - 如何在关闭与服务器的连接之前确保从nginx + fastcgi获取所有内容?

curl -v http://example.com -sL -H 'Connection: close'

以下是会话卷曲记录的示例:

user@server:~$ curl -v http://example.com -sL -H 'Connection: close'
* About to connect() to example.com port 80 (#0)
*   Trying 111.111.111.111... connected
* Connected to example.com (111.111.111.111) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> Accept: */*
> Connection: close
> 
< HTTP/1.1 200 OK
< Server: nginx/1.6.2
< Date: Mon, 22 Dec 2014 20:15:33 GMT
< Content-Type: text/html; charset="utf-8"
< Connection: close
< Set-Cookie: PHPSESSID=if5b1f79ml57dogas9aqa3uq20; path=/
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Pragma: no-cache
< Access-Control-Allow-Origin: *
< X-Expires-Orig: Thu, 19 Nov 1981 08:52:00 GMT
< Transfer-Encoding: chunked
< 
< {...3-4 kbytes of data ....}
<
* Recv failure: Connection reset by peer
* Closing connection #0

3 个答案:

答案 0 :(得分:1)

如果确实发生了这种情况,那就是错误的行为(代表服务器)。 RFC 7230第6.1节说

  

&#34;关闭&#34;连接选项定义为发送者发信号   该连接将在完成后关闭   响应。例如,

 Connection: close
     请求或响应头字段中的

表示   当前请求/响应完成后,发送方将关闭连接(第6.6节)。

响应之后完成

答案 1 :(得分:0)

恕我直言,这是卷曲不当行为(需要说我使用RHEL5附带的旧卷曲/ 7.15.5),你可以通过将Apache作为代理服务器置于中间来解决它,它将取代标题和行为将是预期的。

请参阅https://i.imgur.com/HmBbX2K.png

在我的环境中还有一个HAProxy服务器,它也可以干扰

  

[...] haproxy添加了一个&#34;连接:关闭&#34;标头转发给服务器的请求。   不幸的是,当某些服务器看到此标头时,它们会自动克制   从使用chunked编码获得未知长度的响应,而这一点   是完全不相关的。

但它也将curl识别为客户端在DATA阶段早期关闭连接。

使用SOAP UI或其他客户端也没有问题。

答案 2 :(得分:0)

curl很可能用完了所有客户端端口 - netstat -nat可以打印所有连接状态,我打赌你会发现很多{ {1}},这意味着TIME_WAIT首先关闭连接。