cinatra
cinatra copied to clipboard
`http_client` 对于错误号的判断,没有考虑到`ec == boost::asio::error::eof` 的情况
boost::asio
的 read
/async_read
的各种版本,都会尽可能地多读取数据,而非恰好停止在需求的未知;
这可能导致,reed_buf_
实际已经有,供后续方法处理的数据,仍然调用网络读取方法的时候,遇到eof,
而使得ec
,接收到一个非0的boost::asio::error::eof
,使得形如:
if (!ec) {
...
}
的判断失败;
调整有三类:
- 增加一个
is_ec_ok
的方法:
static bool is_ec_ok(const boost::system::error_code& ec)
{
//return !ec;
return !ec || ec == boost::asio::error::eof;
}
-
将
if (!ec) {...}
修改为if (is_ec_ok(ec)) {...}
-
部分读取函数,用到了传入的
size
变量,来判断read_buf_
中,有多少可用的字节数据; 这里需要根据情况,具体修改。
引发客户端错误的服务端用例:
服务端,以chunk的方式,发送一个短小的文档即可。
最新代码有chunked测试UT验证