gohead问题描述

UI将获取扫描无线列表的接口formWifiApScan,由get换成了POST,此时无法获取到数据,通过抓包分析,为webserver未正常及时返回数据,同时看到content-lengthy为0。

分析过程

今天晚上又与李权跟了一下这个问题,之前良明遇到过,了解了个大概,但还是没完全弄清楚,借这个机会,一起深挖了一下。结果为:处理空悬,未调用注册的回调处理,如果没有超时结束,那么将一直处于此状态,而非循环。

几个问题:对于goahead协议状态处理还是不深,socketGets 这个函数返回值没有弄清楚。

websReadEvent关键状态机函数

wp->state这个值是状态处理的核心:

#define WEBS_BEGIN 0x1 /* Beginning state */

此状态为新建一个wp时的初始状态

#define WEBS_HEADER 0x2 /* Ready to read first line */

读到第一行http协议时,进入到websParseFirst函数,然后转为此状态 ,此状态会调用socketGets 来读取全部的http头部。

#define WEBS_POST 0x4 /* POST without content */

注释不准,应该为POST without content-length,

此状态不会明确调用 websUrlHandlerRequest处理,但会在读取完上传数据后再进行回调,因此需要浏览器先主动关闭发送数据端,然后触发到eof,即没有数据了,goahead会进行处理,然后把需要的数据再回传浏览器, 估计这种用法较少。

#define WEBS_POST_CLEN 0x8 /* Ready to read content for POST */

很常用,有明确的长度

POST request with content specified by a content length

#define WEBS_PROCESSING 0x10 /* Processing request */

此状态标识为处理中,websUrlHandlerRequest 中用到,但很少有请求分2次处理,因此较少用此状态。

关键函数:socketGets

此函数为一行一行的解析http头,>0时,表示解析成功, == 0 时表示头部解析完成,

<0时,表示未完整解析 或 未读到数据,这个函数也杂,状态多,问题也多(正如之前 ITB A6 goahead那篇日志分析)。

一般http协议头都有很多行,那么此函数会多次在状态机中被调用 ,处理于WEBS_HEADER状态。

当协议头读完时,也就是\r\nr\n时,会返回0,进一步调用处理

经过这里时,wp-state基本会切换 (处理cgi时不会切换,前面的WEBS_POST状态)。

好了,本次的问题也就在这里了,经过上面这么长铺垫,这就好理解了。

websParseRequest函数会把http协议会中的数据(除了第一行,见上面解析),一次性的处理,

对于content-length的处理如下,如果clen==0时,就不设置 WEBS_CLEN标识,但实际上,协议中未说 为0时代码长度不确定,而是就是没有数据,如注释中描述,为了避免攻击,则将clen=0,

但是关键在于,不设置 WEBS_CLEN状态,则无法进入到 WEBS_POST_CLEN状态机,于是产生了问题。

websGetInput 返回 0 Return 0 to get more data, 如注释所述。 再次调用 websGetInput 函数时,由于本来就是没有数据,又是非阻塞的,所以socketGets返回-1,同时web浏览器又没有关闭发送连接,所以进不了eof,如下else就什么 也没做 (HP_FIX还是这么有缘),最后return -1(不会调处理函数)

再回到websReadEvent函数 wp->state = WEBS_POST;这个状态处理不了(前面提到它依赖于浏览器关闭发送连接,才能进入处理,设置eof)。

到了这里,只有等着浏览器超时了,今天用谷歌浏览器测,应该10秒左右会发送FIN(不确定是否为js中设置的),然后收到后 select触发处理,进入到websUrlHandlerRequest 函数回调,最后在websDone中写socket出错...

数据无法发出去。 或发出去一截,应该是时间差,因为会收到对方的reset。

修改方案

建议同良明,在websParseRequest函数中,将conten-length的处理:对于<=0时,也设置

wp->flags |= WEBS_CLEN;

以保证状态切换为WEBS_POST_CLEN

补充

对于如上Crash这种情况,又是一个坑,因为当conten-length为0时,再次进入状态机时,text是为空的,在goahead 2.5上已经fix了这个问题,对text有判空处理,但是在AC18(从AC6上移植的,应该与2.5这个版本接近)却没有,

昨天晚上验证时,UI对于POST请求,没有跟?random,数据,因此query[0] 是‘\0’,不会进入到对text的处理, 所以验证很happy,

但是今天UI应加了?random,结果query是有值的,而text没有判空处理,所以大面积Http Crash,

虽然是一起坑,但是还是 goahead本身对协议处理弱...

goahead content-length为0时的问题相关推荐

  1. The maximum string content length quota (8192) has been exceeded while reading XML data

    原文: The maximum string content length quota (8192) has been exceeded while reading XML data 问题场景:在我们 ...

  2. 关于Qstring.replace传参Qstring.length为0引起程序退出的记录

    如图,在调用289行,时程序异常退出,确认数据里面已经包含空格: 目的:将字符串内的空格替换为空. 分析:单步调试,发现程序进入618行进入死循环,一直不出去,直到奔溃 同时发现new_value.l ...

  3. 【MyBatis使用】mapper.xml 文件内<if test>标签判断参数值不等于null和空 当参数值为 0 时筛选条件失效原因分析(源码探究)

    这个问题有不少小伙伴遇到过,也给出了解决方案,但是没有探究原因,这次读一下源码,看看原因在哪里. 1. 条件失效情况复现 Mapper.xml内的动态SQL如下[伪代码] <select id= ...

  4. gridcontrol值为0时设置为空_CSS设置宽高的小技巧

    一.css宽高自适应: 1.宽度自适应: 元素宽度设为100%(块状元素的默认宽度为100%) 注:应用在通栏效果中 2.高度自适应: height:auto;或者不设置高度 3.最小,最大高度,最小 ...

  5. echarts图表,多个柱体,其中有数据为0时不占位

    一.会有空位的情况 当某些数值为0时,会空着,显得不好看. 代码示例: option = {tooltip: {trigger: 'axis'},legend: {data: ['A', 'B', ' ...

  6. echarts柱状图值为0时不显示以及柱状图百分比展示

    echarts柱状图值为0时不显示以及柱状图百分比展示 1.效果展示 2.代码 <template><div id="container"><div ...

  7. android设备id完美解决方法,安卓获取渠道名渠道id Android获取设备唯一标识的终极解决方法,防止安卓7.0时崩溃问题...

    一,先说获取渠道名(这里以友盟为例) /* * 4.5.1新加渠道名字段,用来传给后台去统计各个渠道下载量 * */ public static String getSource() { //获取渠道 ...

  8. 从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误

    从.NET1.1升级到.NET2.0时出现的PInvokeStackImbalance错误 微软官方的解释(http://msdn2.microsoft.com/zh-cn/library/0htdy ...

  9. oracle 取今日0时,Oracle 取得当天0时0分0秒和23时59分59秒

    1. 取得当天0时0分0秒 select TRUNC(SYSDATE) FROM dual; 2. 取得当天23时59分59秒(在当天0时0分0秒的基础上加1天后再减1秒) SELECT TRUNC( ...

最新文章

  1. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)
  2. BFC(Box Formatting Context)的原理
  3. js中json法创建对象(json里面的:相当于js里面的=)
  4. 【MySQL】sysbench压测服务器及结果解读
  5. Matplotlib入门
  6. Linux 学习重点内容(第二节)
  7. Tiny6410上安装debian基本系统的过程
  8. mysql 7天自动拒单功能,mysql查询最近7天的数据,没有数据自动补0
  9. [译]不要在UI主线程中进行耗时的操作
  10. OpenCV_11 轮廓检测:图像的轮廓+绘制轮廓+轮廓近似+边界矩形+椭圆拟合+直线拟合
  11. LeetCode633 | Sum of Square Numbers (Easy)
  12. 支撑200并发_搞清楚系统到底怎样支撑高并发以及架构图的绘制(面试向)
  13. python网络爬虫爬取视频_Python网络爬虫——爬取小视频网站源视频!自己偷偷看哦!...
  14. Java高级面试题!这是一份面向Java开发者的复习指南
  15. 关于killer网卡在linux 2.6.11版本以上的驱动安装
  16. 医学图像分类 神经网络,神经网络图像识别技术
  17. 正版rust30005_预算大概在3000以内可以买猫吗?
  18. 什么是公约数/公因数
  19. python autocad显示_Python AutoCAD 系统设置的实现方法
  20. 小程序和钉钉发版后老版缓存的问题调研

热门文章

  1. 云计算平台(检索篇)-Elasticsearch
  2. 固定资产制作修理费应如何入账
  3. TreeView控件节点重命名后没有进入beginEdit的解决方案
  4. Karush-Kuhn-Tucker 最优化条件 (KKT 条件)(转载)
  5. UA MATH567 高维统计IV Lipschitz组合2 Spherical Distribution的Lipschitz函数 Isoperimetric不等式
  6. MongoDB基本概念学习 - 集合
  7. 三维比例变换学习(WPF演示)
  8. 在测试者的易用性测试工具套装中他们需要什么(译)
  9. 通过分析来精简你的测试的6种方法(译)
  10. [POI2005]BAN-Bank Notes