20210618 支持检查s2c单项流的情况下是否是HEAD *************************************************************** 20200109 1. 增加协议识别标签,配合MESA_proto.so统计协议流量 *************************************************************** 20191205 1.增加http http_line2value函数,支持获取value内容 *************************************************************** 20191112 1.增加http单包解析函数http_host_parser 2.增加HTTP_Parser.c文件,用于测试新增代码 *************************************************************** 20190111 绝对URI(http://)的判别方式: 1.http_infor:is_ab_uri变量 2.通过函数int is_absolute_uri(void* app_info)获取; 此功能在20190111版本之后支持,需要更新http.so,http.h *************************************************************** 20190105 支持GET跨包的处理:请求方法之前的空格删除以免影响识别,已经开始缓存内容之后不需要删除空格以免无法处理起始行的三个元素(http_analyseHttpConnection) ************************************************************ 20181113 修复bug:HTTP异常包处理,http起始行挎包,判断请求方法结束之后,buf被释放,无法正确识别起始行 ************************************************************ 20170207 1. 没有host的URL=serverIP+URI 2. a_http->parser.p_url只保存完整确定的URL,不保存URL拼接之前的中间状态 ************************************************************ 20161219 1. 应答行被识别为请求行。有可能是平台按照data建立连接,S2C被认为是C2S导致。针对这种情况,记录日志。 ************************************************************ 20160905 1.标准字段也支持完整行 2.科技网段错误的问题 3.代理的逻辑 注意:起始行数据解析不够,此时跨包会调用业务层,但有可能跨包的数据不是头部,是上个会话的尾部,但是丢包重置,被迫新建会话。 例如tcp_seq.pcap 但是为了减少不必要的回调,在起始行跨包不进行业务层回调。 ************************************************************ 20160715 1.处理在丢包下的重置 2.g_http_prog_para.batch_field_maxnum是所有业务插件的兴趣域总数 ************************************************************ 201690701 1. 在存在扩展域的情况下,扩展域使用hash进行识别 2. 增加tcp_http的统计 ************************************************************ 20160620 V4 1.增加包处理延时的统计 ************************************************************ 20160612 V4 1.支持\n的完整行处理,修改完整行的处理逻辑 ************************************************************ 20160601 V4 1. http_findtStartFlag http_judgeHttpMethod(method, (char*)tcp_detail->pdata, curdir)一直是tcp_detail->pdata不正确,在处理 2. 特殊包处理:GET之前有NULL 3. 识别httpflag之后不清除pbuf,因为之后还需要起始行,避免跨包时起始行错误 4. 平台C2S侧丢包,可能在丢包之前S2C先到,然后C2S的丢包情况才知晓。 所以C2S还没有处理完,丢包还未知晓,S2C就到来了,那么此时http_state还是C2S的状态,处理S2C是有问题的。S2C会顺着C2S的状态解析下去。 所以应该在S2C到来前C2S还没有结束,就resetC2S状态。 ************************************************************ 20160526 1. curdir=0 原因: 头部结束两个\r\n,多余的\r\n会人为是新的http_infor chunk长度为0结束之后\r\n\r\n,\r之后跨包,就会人为是新的http_infor 后果: 导致http_session_seq不对 修改:参见文档特殊处理部分 2. 请求侧单向流的情况下及时释放http_infor,不再等到tcp流结束的时候才释放 3. 丢包情况下,设置http_session_seq=-1 4. 支持http_batch,使用参见文档 to do 5. 解决代理死循环的问题 to do 6. 学利发现的Bug:tcpdata是GET URL但是业务层拿到的是content to do 7. http代理增加开关 8. chunk情况下,content_length 在最后数据结束时时总长度 9. 会话中,业务层不再需要该会话信息,那么就不解析gzip 10.http stat新增pend与close的统计等内容 ************************************************************ 20160301 1.处理绝对URL和相对URL 2.增加S2C单向流的代理识别 3.增加代理捕包功能,需要与捕包插件配合使用 日志: FATAL INFO:pending and close DEBUG:uri and URL DEBUG:connect ************************************************************ 20160128 1.支持deflate解压缩 2.查找完整行时增加内存上限避免数百KB内存的realloc ************************************************************ 20160122 1. set HTTP_DATA_END when http_clearHttpInfor and before build http_infor ************************************************************ 20151103 1. http_region2proto_flag 转换为大小写不敏感之后再匹配 不使用此函数可以不用更新 ************************************************************ 20150917 1.建立第一个http_infor的if else错误,此bug影响第一个数据包是单向流且是S->C的方向 ************************************************************ 20150818 1.修复http_url_decode的bug ************************************************************ 20150609 1.check mem:http_doWithGzipData !!!http头部可能有重复的消息域 ************************************************************ 20150603 1.利用http_state和当前包处理结束获得HTTP头部(包含起始行和头域): 处理逻辑: 1)http_state=DATA_BIGIN,session->buf赋值,调用业务层 2)当前包分析header结束,并且http_state< DATA_BIGIN, session->buf赋值,调用业务层 a_http->phttp_begin:指向http单侧数据的开始或者当前tcp数据包的起始位置 业务层处理逻辑: http_state<= DATA_BIGIN && session->buf!=NULL,进行处理 switch(session_info->prot_flag) { case HTTP_STATE: if(a_http->http_state<=HTTP_DATA_BEGIN&&a_http->http_state>=HTTP_START_LINE) { if(session_info->buf!=NULL) { fwrite(session_info->buf,session_info->buflen,1,g_hs_prog_para.fp); } } } HTTP头部数据获取说明: 头部数据包含起始行和头域的原始数据 头部数据包括请求侧和应答侧数据 2.折叠行copy处理: 存在折叠符号的完整行会删除此完整行中的\t\r\n空格字符,其余完整行不删除\t\n空格 起始行中的折叠符号不能删除,因为删除空格会影响起始行的判断 完整行在找key value的时候会删除空格\t\r\n 完整行可能是\r \r\n \n 新增\n结束的完整行 3. 确认是http协议之前不准调用业务层 ************************************************************ 20150601 1. 增加pending与close的调试信息(log_leve=20) 2. 修改bug,pendng!=close,lost,释放链接没有调转方向 ************************************************************ 20150420 1.dig的未初始化 ************************************************************ 20150401 1.处理折叠行,before中没有数据 ************************************************************ 20150330 1.调试98-122.pcap,如果丢包出现在应答侧,而且正好packet_entity_len=0 ************************************************************ 20150326 1.处理完成头域之后,继续处理正文,不能return 2.丢包情况下的处理:应该按照a_tcp的方向,而不是当前正在操作的a_http_stream的方向 ************************************************************ 20150323 1.处理conteng-length:-1的情况 ************************************************************ 20150320 1.处理完成http_infor,可能释放结构体,不应该在释放之后还继续访问存放在此结构体重的mgs_status ************************************************************ 20150318 1.当tcp有丢包的时候,应该在DATA_BEGIN时才能继续处理,其它阶段全部重置 -------------------------------------------------------------------------------------------------------- ************************************************************ 20140327 1. 支持HTTP CONNECT代理 ************************************************************ 20141016 1. 支持代理的版本和不支持代理的合并,添加变量“”确定是否支持HTTP代理 2. 添加HTTP统计功能:filed_stat,配置文件增加: /*0 输出到屏幕 1:输出到文件*/ stat_screen_print=0 stat_file=./log/http/http_stat.log /*0 means close stat*/ stat_cycle=0 ************************************************************ 20141017——头文件整理 1. HTTP_Message.h->http.h ************************************************************ 20141113 1. 删除KILLME 2. http.h增加版本号 3. 支持双栈的http代理, papp20141024测试 ************************************************************ 20141114 1. 如果解析层没有打开ungzip的开关,业务层注册的是ungzip,那么业务层不会收到数据 ************************************************************ 20141121 1. 上层不需要data,但是此时有可能是over_flag状态,越要调用上层 ************************************************************ 20141201 1. xjfd升级,去掉XJFD_PROJRCTY相关,维护一套代码 2. chraset 改为memcasemem ************************************************************ 20141202 1. http_getRegionName的参数是prot_flag,应该转换为region_id, makefile增加o2 ************************************************************ 20141203 1. http_judgeHeaderOver realloc->dictator_realloc ************************************************************ 20141204 1. http.h更新 V3 版本 1) 格式文档解析解gzip的压缩,更新最新的库 2) http.h删减结构体 3) 程序默认ungzip,默认不链接TextProc,使用 4)dictator 5) 代理部分 6)检查结构对齐 7)检查内存泄漏 8) 好好写一下Makefile -o2 9) 添加const 10) 配置文件的设计:所有字段标准字段都要,写个All即可,标准字段。 11)大小写 12) 注册兴趣域,data, ungzipdata 覆盖选项 qq发送采用火狐浏览器,附件名称需要多一个字段 ************************************************************ 20141209 V3版本 1. 删减http_infor结构体,开放业务层可能使用的变量 2. 兴趣字段整理,添加注释,提供ALL字段,含义是需要http.conf的所有字段 字段名字改变 3. 某些if判断修改为assert 4. 程序默认解gzip压缩,可通过配置文件关掉解压缩的模块 5. http插件默认不链接解压缩的库,通过Makefile链接库 6. 修改Makefile,增加-O2的选项 7. 确认不是http协议之后,直接返回 8. 提供给业务层的函数参数增加const等修饰 9. http代理默认打开,目前测试不多,不稳定时提供给宏定义关闭此功能 10.正文注册逻辑。原始数据:CONTENT,压缩数据UNGZIP_CONTENT 业务层更新须知: 配置文件main.conf、http.conf有更新 业务层需要更换http.h,程序需要修改case名称 需要修改配置文件inf 更改记录: 20141210 整理业务层可注册字段,添加注释,哪些是请求侧,哪些是应答侧,支持ALL注册所有配置文件中的字段。 解压缩的初始化。 自测: 内存泄露 字节对齐 dictator_malloc 代理 ************************************************************ 20141209 V3版本 1. 功能说明 支持不支持解压缩根据配置文件定制; papp增加stream_register.h在stream_inc中 cont-length:134 cont-range:bs 100-233/1000 1. 函数指针->函数 2. 半流状态注册:请求侧结束 3. 开始行:method res_code uri注册+所有头域 头部结束:请求+应答 4. 整理http解析状态ok 5. content-range无业务注册,不需要解析,指针为NULL。优化cont-range的解析函数ok 6. method+res_code 提供函数ok 7. over_flag link_state chunk_state状态图 ok 8. 请求方法判断http_judgeHttpMethod修改->memcmp OK 9. 扩展字段:域与值,但是在session中保留整行,value是整行传送 OK 20141231 修改请求方法的代码 注册某些字段才会处理value值,处理HOST charset除外 20150104 修改cont-range字段处理:content-range无业务注册,不需要解析,指针为NULL。优化cont-range的解析函数 不再http_infor中提供函数指针,修改为提供函数的方法 over_flag能不能合并?over_flag== 单向流的请求结束 或者双向流的应答结束 或者出错处理(特殊处理:data建立连接,dir是1,但并不一定是单向流,所以单向流的请求结束并且不是第一个数据包才能说明该会话结束,所以保留over_flag的状态) 修改代码,尽量函数调用不应该太深。 添加http的方向变量curdir 整理注册域,增加状态注册、请求起始行注册、应答起始行注册 代理处理整理 20150105 代理部分测试 20150106 data建立连接,单向流的识别:在最后释放会话。因为 ************************************************************ 20150114 提供请求方法获得字符串描述的函数的函数 ************************************************************ 20140126 1. 增加url_decode函数 2. http_infor增加append_infor变量,http.h修改,向上兼容 3. 增加other字段,http.conf不兼容 4. HTTP.h修改请求方法的顺序,不兼容 5. 修改代理模块。 6. PORT_DROPPKT透传给平台 ************************************************************ 20150202 1. 检查内存泄露: chunk编码*offset+1 host泄露原因是应答消息结束复位state,应该继续HTTP_DATA_END. 2. HTTP_RETURN_DROPPKT 继续解析,只是返回给平台是DROPPKT。原因一,如果不再继续解析当前包,那么可能解析出错。原因二,如果不想传给其他业务层,需要插件管理返回DROPME. *************************************************************** HTTP备忘记录: 1.关闭总的解gzip压缩,http_main.conf,则插件不支持解析gzip。 2.HTTP_ALL是所有头部。 3.HTTP_OTHER是非标准头域的其它域。 4.扩展字段的buflen是:之后的,但是完整行放在了 cur_http_node->parser.append_infor.content = data+start_pos; cur_http_node->parser.append_infor.contlen 所有的头域都做了一样的处理,既可以是:之后的,也可以获得完整行。 5.http_state==HTTP_DATA_BEGIN表示头部结束。 a_http->session.buf 当前http会话开始的地方; a_http->session.buflen 距离http会话开始的长度; 6.跨包是session.buf和HTTP_DATA_BEGIN一样,只是http_state状态不一样。 7.批处理:(需要注册http_state才有此功能(删除)) 保留当前pkt中的完整域的指针。不完整的域不计入,留在下一个pkt完整之后计入。 保证回调业务层的域不重复。