来自服务器的响应不正确的 HTTP Content-Length 会导致客户端出现不同的结果

Posted

技术标签:

【中文标题】来自服务器的响应不正确的 HTTP Content-Length 会导致客户端出现不同的结果【英文标题】:Improper HTTP Content-Length in response from server causes different results on client side 【发布时间】:2012-07-11 23:22:30 【问题描述】:

服务器

我有一个基于 Boost::Asio 的 http WebService,它异步处理客户端连接并回复带有 HTTP 标头前面的 JSON 内容:

std::string response += "HTTP/1.0 200 OK\r\n";
response += "Content-Length: 2000\r\n";        
response += "Content-Type: application/json\r\n";
response += "Connection: close\r\n";
response += "\r\n";
response += meassageBody;

其中 messageBody 是大小不大于 500 的 JSON 结构。

每次 - 在将响应发送回客户端之后 - 我调用下面的序列来关闭(我相信)套接字:

m_oSocket.shutdown(boost::asio::ip::tcp::socket::shutdown_both, ec);
m_oSocket.close();

客户

为了测试服务器,我在 Qt 中编写了一个小型客户端应用程序,它向服务器询问内容并显示是否返回了任何错误。

如果服务器回复http头中的“Content-Length”值:

硬编码(如上例中为 2000),然后 Qt 客户端显示错误代码 2,代表“连接关闭”;

设置为合适的 JSON 数据大小(通常约为 400-500),然后 Qt 客户端显示错误代码 0,代表“未知错误”;

问题:

    在http头中发送不正确的“Content-Length”值是否会对连接的终止方式产生这种影响?

    我认为关闭服务器端的套接字可以使连接在客户端也被视为关闭。如何同时完成两者:发送正确的“内容长度”值和客户端的“连接关闭”状态?

谢谢

【问题讨论】:

【参考方案1】:

Content-Length 标头必须是内容的字节数,不多也不少。如果不是,则从客户端的角度来看,结果是不可预测的。

由于您使用的是 HTTP 1.0,因此您不应关闭服务器上的连接(也不应发送 Connection: close 标头。客户端将在读取数据后关闭连接。

【讨论】:

感谢您的回复。在另外阅读了关于 HTTP 1.0 和 1.1 的内容之后,现在一切都变得更加清晰了。

以上是关于来自服务器的响应不正确的 HTTP Content-Length 会导致客户端出现不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Angular,woocommerce,wordpress JWT AUTH 登录错误,不正确的 200 OK 来自服务器的响应可能破坏登录尝试

Angular http 通过 404 获取现有且正确的 URL !!!来自 json 服务器

POST请求的几种content type类型

来自服务器[200]的HTTP响应不允许HTTP升级到WebSocket

.NET HttpClient - 当响应标头的内容长度不正确时接受部分响应

Docker - 来自守护程序的错误响应:收到意外的 HTTP 状态:503 服务不可用