From ae1d9371fa5fcdf28dc4691562996775279f22e8 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Tue, 30 Oct 2018 09:35:19 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96http=E6=8B=86=E5=8C=85?= =?UTF-8?q?=E5=99=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpRequestSplitter.cpp | 17 +++++++++++++---- src/Http/HttpRequestSplitter.h | 10 +++++++++- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/Http/HttpRequestSplitter.cpp b/src/Http/HttpRequestSplitter.cpp index 00e6e5fa..5f7353be 100644 --- a/src/Http/HttpRequestSplitter.cpp +++ b/src/Http/HttpRequestSplitter.cpp @@ -54,10 +54,12 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) { //数据按照请求头处理 const char *index = nullptr; - while (_content_len == 0 && (index = strstr(ptr,"\r\n\r\n")) != nullptr) { + uint64_t remain = len; + while (_content_len == 0 && remain > 0 && (index = onSearchPacketTail(ptr,remain)) != nullptr) { //_content_len == 0,这是请求头 - _content_len = onRecvHeader(ptr, index - ptr + 4); - ptr = index + 4; + _content_len = onRecvHeader(ptr, index - ptr); + ptr = index; + remain = len - (ptr - data); } /* @@ -65,7 +67,6 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) { */ tail_ref = tail_tmp; - uint64_t remain = len - (ptr - data); if(remain <= 0){ //没有剩余数据,清空缓存 _remain_data.clear(); @@ -124,6 +125,14 @@ void HttpRequestSplitter::reset() { _remain_data.clear(); } +const char *HttpRequestSplitter::onSearchPacketTail(const char *data,int len) { + auto pos = strstr(data,"\r\n\r\n"); + if(pos == nullptr){ + return nullptr; + } + return pos + 4; +} + } /* namespace mediakit */ diff --git a/src/Http/HttpRequestSplitter.h b/src/Http/HttpRequestSplitter.h index 4b05d137..0e143f49 100644 --- a/src/Http/HttpRequestSplitter.h +++ b/src/Http/HttpRequestSplitter.h @@ -42,7 +42,7 @@ public: * @param data 需要添加的数据 * @param len 数据长度 */ - void input(const char *data,uint64_t len); + virtual void input(const char *data,uint64_t len); protected: /** * 收到请求头 @@ -64,6 +64,14 @@ protected: */ virtual void onRecvContent(const char *data,uint64_t len) {}; + /** + * 判断数据中是否有包尾 + * @param data 数据指针 + * @param len 数据长度 + * @return nullptr代表未找到包位,否则返回包尾指针 + */ + virtual const char *onSearchPacketTail(const char *data,int len); + /** * 设置content len */