我使用 boost read_until 函数来促进通过套接字接收和解析 HTTP 消息。所以我是什么trying要做的就是从套接字中 read_until 直到\r\n
,我认为应该给我一行 HTTP 标头。 (每个 HTTP 标头行以\r\n
,根据标准。)但是,我实际上从 read_line 得到的是整个标题,有几行长。 (标题以\r\n\r\n
,或者换句话说,一个空行。另外,根据 HTTP 标准。)这是一个代码片段。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 从套接字读取的内容比头的第一行多,并将其放入 request_buff 中?
请注意,我使用 netcat 来接收请求,并且一切正常。因此 HTTP 消息本身的格式似乎正确。
该文档似乎暗示了这一点:
"该函数用于读取数据到指定的streambuf中untilStreambuf 的获取区域包含指定的分隔符。”
但仔细看看:
直到Streambuf的获取区域包含 ...
因此,它并不承诺就此停止。它只是承诺在读取包含您的分隔符的块后立即返回给您。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)