我有一台服务器默认使用" 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
答案 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
首先关闭连接。