cinatra icon indicating copy to clipboard operation
cinatra copied to clipboard

`http_client` 对于错误号的判断,没有考虑到`ec == boost::asio::error::eof` 的情况

Open sarrow104 opened this issue 4 years ago • 1 comments

boost::asioread/async_read的各种版本,都会尽可能地多读取数据,而非恰好停止在需求的未知;

这可能导致,reed_buf_实际已经有,供后续方法处理的数据,仍然调用网络读取方法的时候,遇到eof, 而使得ec,接收到一个非0的boost::asio::error::eof,使得形如:

if (!ec) {
  ...
}

的判断失败;

调整有三类:

  1. 增加一个 is_ec_ok的方法:
        static bool is_ec_ok(const boost::system::error_code& ec)
        {
            //return !ec;
            return !ec || ec == boost::asio::error::eof;
        }
  1. if (!ec) {...} 修改为 if (is_ec_ok(ec)) {...}

  2. 部分读取函数,用到了传入的 size 变量,来判断 read_buf_ 中,有多少可用的字节数据; 这里需要根据情况,具体修改。

sarrow104 avatar Nov 18 '20 07:11 sarrow104

引发客户端错误的服务端用例:

服务端,以chunk的方式,发送一个短小的文档即可。

sarrow104 avatar Nov 18 '20 07:11 sarrow104

最新代码有chunked测试UT验证

qicosmos avatar Jan 14 '24 12:01 qicosmos