首页 文章

服务器响应中的HTTP内容长度不正确会导致客户端出现不同的结果

提问于
浏览
0

Server

我有一个基于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();

Client

为了测试服务器,我在Qt中编写了一个小客户端应用程序,要求服务器提供内容并显示是否已返回任何错误 .

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

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

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

Questions:

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

  • 我认为在服务器端关闭套接字可能会使连接在客户端也被视为关闭 . 如何同时完成两项任务:在客户端发送正确的“Content-Lenght”值和“Connection closed”状态?

谢谢

1 回答

  • 1

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

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

相关问题