【发布时间】:2013-11-28 00:54:34
【问题描述】:
我正在使用 boost read_until 函数来帮助通过套接字接收和解析 HTTP 消息。所以我正在尝试 做的是从套接字读取_until 直到\r\n,我认为这应该给我一行HTTP 标头。 (根据标准,每个 HTTP 标头行都以 \r\n 结尾。)但是,我实际上从 read_line 得到的是整个标头,有几行长。 (标头以\r\n\r\n 结尾,或者换句话说,一个空行。另外,根据HTTP 标准。)这是一个sn-p 代码。 sock 是套接字文件描述符。
boost::system::error_code err;
io::streambuf request_buff;
io::read_until(sock, request_buff, "\r\n", err); // read request line
if (err)
throw Exception(string("Failed to read HTTP header request line from socket: ") + err.message());
cerr << "Read " << request_buff.size() << " bytes." << endl;
istream request(&request_buff);
try {
request >> m_strMethod >> m_strPath >> m_strHttpVersion;
} catch (std::exception& e) {
throw Exception(string("Failed to parse HTTP header: ") + e.what(), e);
}
if (!request)
throw Exception("Failed to read HTTP header");
if (!alg::istarts_with(m_strHttpVersion, "HTTP/"))
throw Exception(string("Malformed HTTP header: expected HTTP version but got: ") + m_strHttpVersion);
string strTemp;
while (std::getline(request, strTemp))
{
cerr << "Extra line size = " << strTemp.size() << endl;
cerr << "Extra line: '" << strTemp << '\'' << endl;
}
我希望看到的输出表明它读取了 HTTP 消息第一行中的字节数,并且没有“额外”输出。相反,我得到的是整个 HTTP 标头中的字节数,以及一个空白的额外行(这可能是因为 >> 操作没有消耗第一行末尾的换行符),然后是标题和另一个空白行(表示标题的结尾,如上所述)。为什么 read_until 从 socket 中读取的内容比 header 的第一行多,并放入 request_buff 中?
注意,我使用 netcat 来接收请求,并且可以正常通过。所以 HTTP 消息本身的格式似乎是正确的。
【问题讨论】:
标签: c++ sockets boost boost-asio istream