cpprestsdk有bug.
好不容易将cpprestsdk移植到MinGW,并编译通过,出于安全还是先将samples还有tests测试一下是否正常。
用samples/blackjack一测试就出现奇葩现象,server一端会时不时出现一次response中,两次发送headers,并且没有任何征兆。
当用gdb调试,break+command,断点打印浏览时,却从没有发生过一次奇怪现象。毕竟断点使得程序更加慢而且更加偏向串行的方式在运行。
下面是现象的抓包




正常发两次包,第一次72字节header,第二次222字节content。


异常也发了两次包,第一次72字节headers,第二次294 (72 + 222 )字节 headers + contents。
分析代码cpprestsdk/Release/src/http/http_server_asio.cpp,发送是由m_write,m_write_size两成员控制。
但搜索下来,只有一处赋值,“m_write = m_write_size = 0; ”,只能唯有用watch+command来观察。
观察点分别是 14: m_write_size, 15: m_write。

m_write_size 被修改触发断点。
然后序列化headers,并发送。

m_write 被修改触发断点。
发现 m_write_size 在http_headers.match()匹配content_length字段同时赋值,无语。m_write赋值的地方也无语,分析代码根本就不能搜索到。
从代码分析得到流程。
1. http_response的组成,http_headers一个字典容器,body是一个instream,还有一个用于发送的streambuf。
2. 我们的处理代码先向body写入内容,然后调用reply。
3. http_headers先序列化到streambuf,并发送第一个数据包。
4. 完成后将body写入streambuf,并发送第二个数据包。
正常跟异常两种情况下,第一次发包正常,第二次发包有差。原因可能是streambuf,没有清数据。

asio在取出iocp事件后,是先清streambuf数据,然后才会去回调handler,但为什么还要有例外不正常的情况发生呢。原因是cpprestsdk开发小组的成员在偷懒了。(小组压根就不打算移植到mingw,http_server的asio实现版只针对非windows,windows开发环境下默认使用httpsys实现版,所以就不会去考虑asio可能运行在winiocp的情况了)。

没有去理会bytes_transferred,直接忽略, 回调lambda [=](error_code& ec, size_t)。但是winiocp有一种情况,就是WriteEx时马上成功了,没有发生BLOCKING。投递出去的iocp overlapped,将会是没有错误,同时bytes_transferred也为0。这样一来,asio就只会consume(0),根本没有清理数据,数据残留了下来,后续的发送就是乱套的。这种情况下,就必须自己去做处理。

2020/06/17补充说明:
将boost从1.54换成1.66后,async_write的handler再也没有出现error_code跟bytes_transferred同时都为0的情况。这可能是旧版boost实现的问题?
cpprestsdk有bug.的更多相关文章
- Tomcat一个BUG造成CLOSE_WAIT
之前应该提过,我们线上架构整体重新架设了,应用层面使用的是Spring Boot,前段日子因为一些第三方的原因,略有些匆忙的提前开始线上的内测了.然后运维发现了个问题,服务器的HTTPS端口有大量的C ...
- a标签点击跳转失效--IE6、7的奇葩bug
一般运用a标签包含img去实现点击图片跳转的功能,这是前端经常要用到的东西. 今天遇到个神奇的bug:如果在img上再包裹一层div,而且div设置了width和height,则图片区域点击时,无任何 ...
- 关于 Chrome 浏览器中 onresize 事件的 Bug
我在写插件时用到了 onresize 事件,在反复地测试后发现该事件在 Chrome 及 Opera(内核基本与 Chrome 相同,以下统称 Chrome)浏览器打开时就会执行,这种情况也许不能算作 ...
- Chrome出了个小bug:论如何在Chrome下劫持原生只读对象
Chrome出了个小bug:论如何在Chrome下劫持原生只读对象 概述 众所周知,虽然JavaScript是个很灵活的语言,浏览器里很多原生的方法都可以随意覆盖或者重写,比如alert.但是为了保证 ...
- 一个粗心的Bug,JSON格式不规范导致AJAX错误
一.事件回放 今天工作时碰到了一个奇怪的问题,这个问题很早很早以前也碰到过,不过没想到过这么久了竟然又栽在这里. 当时正在联调一个项目,由于后端没有提供数据接口,于是我直接本地建立了一个 json ...
- 了不起的 nodejs-TwitterWeb 案例 bug 解决
了不起的nodejs算是一本不错的入门书,不过书中个别案例存在bug,按照书中源码无法做出和书中相同效果,原本兴奋的心情掺杂着些许失落. 现在我们看一下第七章HTTP,一个Twitter Web客户端 ...
- 应该是Angular2的一个bug?
为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...
- 记录一次bug解决过程:数据迁移
一 总结 不擅长语言表达,勤于沟通,多锻炼 调试MyBatis中SQL语法:foreach 问题:缺少关键字VALUES.很遗憾:它的错误报的让人找不着北. 二 BUG描述:MyBatis中批量插入数 ...
- 关于MJRefresh的下拉加载数据bug
当没有更多数据的时候显示NoMoreData 我的理解是先结束刷新再显示没有更多 今天之前一直没发现有问题 贴之前的代码 [self.collectionView reloadData]; [self ...
- [异常特工]android常见bug跟踪
前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...
随机推荐
- 执行orachk检查数据库环境
Exadata环境巡检需要执行专有的exachk,而普通Oracle环境可以通过执行orachk来检查集群和数据库相关健康状况. 1.使用orachk检查健康状态 使用root用户执行,期间可能需要多 ...
- java中“0x”表示的含义
public static void main(String[] args) { int a = 0xff;//16进制默认是int int b = 0x000000ff; System.out.pr ...
- Power BI 5 DAY
目录 Power BI 数据建模与数据汇总分析 多维数据模型 搭建多维数据模型 搭建方法 注意事项 搭建数据模型思考 数据变量类型 主键ID特点(非空不重复) 星型结构 交叉筛选器方向 单一/两个 连 ...
- BZOJ3364 Distance Queries 距离咨询 题解
原题 简化题意:有一棵 \(n\) 个点的树, \(q\) 组询问,每次询问回答两点间的距离. 令 \(dis[i][j]\) 表示 \(i\) 到 \(j\) 的距离,根节点为 \(rt\) ,则有 ...
- JS Leetcode 179. 最大数 题解分析,sort a-b与b-a的区别,sort排序原理解析
壹 ❀ 引 今天的题目来自LeetCode179. 最大数,题目描述如下: 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你 ...
- NC200179 Colorful Tree
题目链接 题目 题目描述 A tree structure with some colors associated with its vertices and a sequence of comman ...
- NC20115 [HNOI2015]菜肴制作
题目链接 题目 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号 ...
- NVME(学习笔记二)—CMB
什么是CMB 在NVMe Express 1.2 Spec中开始支持一个特性,那就是CMB(Controller Memory Buffer),是指SSD控制器内部的读写存储缓冲区,与HMB(Host ...
- 【Unity3D】Transform组件
1 前言 每个游戏对象有且仅有一个 Transform 组件,Transform 组件保存了游戏对象的位置信息,用户可以通过操作 Transform 组件实现对游戏对象的平移.旋转.缩放等变换.每 ...
- java常用包下载地址(非maven)
httpclient与httpcore: http://hc.apache.org/downloads.cgi jdbc: https://dev.mysql.com/downloads/connec ...