zlMediaKit 10 http相关
创始人
2024-01-20 10:24:10

HttpRequestSplitter.h

HttpRequestSplitter

在这里插入图片描述

结构

    ssize_t _content_len = 0;size_t _remain_data_size = 0;toolkit::BufferLikeString _remain_data;

input

上次还有剩余的数据,就把这次的数据和上次的数据接上。

分包

    const char *ptr = data;if(!_remain_data.empty()){_remain_data.append(data,len);data = ptr = _remain_data.data();len = _remain_data.size();}

解析包头

当 _content_len != 0 || _remain_data_size <= 0 || onSearchPacketTail==nullptr(未找到包尾)

onRecvHeader需要子类实现

    const char *index = nullptr;_remain_data_size = len;while (_content_len == 0 && _remain_data_size > 0 && (index = onSearchPacketTail(ptr,_remain_data_size)) != nullptr) {if (index == ptr) {break;}if (index < ptr || index > ptr + _remain_data_size) {throw std::out_of_range("上层分包逻辑异常");}//_content_len == 0,这是请求头const char *header_ptr = ptr;ssize_t header_size = index - ptr;ptr = index;_remain_data_size = len - (ptr - data);_content_len = onRecvHeader(header_ptr, header_size);}
onRecvHeader返回:
请求头后的content长度, 
<0 : 代表后面所有数据都是content,此时后面的content将分段通过onRecvContent函数回调出去 
0 : 代表为后面数据还是请求头, 
>0 : 代表后面数据为固定长度content,此时将缓存content并等到所有content接收完毕一次性通过onRecvContent函数回调出去
    if(_remain_data_size <= 0){//没有剩余数据,清空缓存_remain_data.clear();return;}

缓存不完整的http头,返回

    if(_content_len == 0){//尚未找到http头,缓存定位到剩余数据部分_remain_data.assign(ptr,_remain_data_size);return;}

goto跳转

onRecvContent会根据场景不同处理固定长度和非固定长度的包

onRecvHeader要求有能分辨固定长度包和非固定长度包的能力

    //已经找到http头了if(_content_len > 0){//数据按照固定长度content处理if(_remain_data_size < (size_t)_content_len){//数据不够,缓存定位到剩余数据部分_remain_data.assign(ptr, _remain_data_size);return;}//收到content数据,并且接受content完毕onRecvContent(ptr,_content_len);_remain_data_size -= _content_len;ptr += _content_len;//content处理完毕,后面数据当做请求头处理_content_len = 0;if(_remain_data_size > 0){//还有数据没有处理完毕_remain_data.assign(ptr,_remain_data_size);data = ptr = (char *)_remain_data.data();len = _remain_data.size();goto splitPacket;}_remain_data.clear();return;}//_content_len < 0;数据按照不固定长度content处理onRecvContent(ptr,_remain_data_size);//消费掉所有剩余数据_remain_data.clear();

onRecvHeader/onRecvContent/onSearchPacketTail

onRecvHeader

/*** 收到请求头* @param data 请求头数据* @param len 请求头长度** @return 请求头后的content长度,*  <0 : 代表后面所有数据都是content,此时后面的content将分段通过onRecvContent函数回调出去*  0 : 代表为后面数据还是请求头,*  >0 : 代表后面数据为固定长度content,此时将缓存content并等到所有content接收完毕一次性通过onRecvContent函数回调出去*/
virtual ssize_t onRecvHeader(const char *data,size_t len) = 0;

onRecvContent

/*** 收到content分片或全部数据* onRecvHeader函数返回>0,则为全部数据* @param data content分片或全部数据* @param len 数据长度*/
virtual void onRecvContent(const char *data,size_t len) {};

onSearchPacketTail

/*** 判断数据中是否有包尾* @param data 数据指针* @param len 数据长度* @return nullptr代表未找到包位,否则返回包尾指针*/
virtual const char *onSearchPacketTail(const char *data, size_t len);

setContentLen

/*** 设置content len*/
void setContentLen(ssize_t content_len);

onSearchPacketTail

const char *HttpRequestSplitter::onSearchPacketTail(const char *data,size_t len) {auto pos = strstr(data,"\r\n\r\n"); //http包的末尾很好判断,两个空行if(pos == nullptr){return nullptr;}return  pos + 4;
}

总结

  • 如何分包的,HttpRequestSplitter::input,包头和包体怎么缓存处理的。

  • http 根据**“\r\n\r\n”**判断包头包体是否结束

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
阳澄湖在哪里哪个省的 阳澄湖是... 点击题目下方苏州生活指南有用 有趣 有态度近期的阳澄湖度很高,3月24日,央视二套《第一时间》直播连...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
金属硬度排行 各种金属硬度 世界上最硬的东西排名分别为硫化碳块,石墨烯,金刚石,金属玻璃和金属锇。这五种物体几乎是整个世界上最坚...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...