From 67f7c3dc8f500ee47bfd51cb7ed57ac32b7b6ee7 Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Mon, 1 Jul 2019 09:53:58 +0800 Subject: [PATCH] =?UTF-8?q?http=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81302=E8=B7=B3=E8=BD=AC=20=E4=BF=AE=E5=A4=8DHttpRequestS?= =?UTF-8?q?plitter=E5=8F=AF=E8=83=BD=E5=86=85=E5=AD=98=E8=B6=8A=E7=95=8C?= =?UTF-8?q?=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Http/HttpClient.cpp | 11 +++++++++++ src/Http/HttpRequestSplitter.cpp | 13 ++++++------- src/Rtsp/RtspPlayer.cpp | 2 +- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Http/HttpClient.cpp b/src/Http/HttpClient.cpp index 72b1c2db..fc4d5269 100644 --- a/src/Http/HttpClient.cpp +++ b/src/Http/HttpClient.cpp @@ -148,6 +148,17 @@ void HttpClient::onErr(const SockException &ex) { int64_t HttpClient::onRecvHeader(const char *data, uint64_t len) { _parser.Parse(data); + if(_parser.Url() == "302" || _parser.Url() == "301"){ + auto newUrl = _parser["Location"]; + if(newUrl.empty()){ + shutdown(SockException(Err_shutdown,"未找到Location字段(跳转url)")); + return 0; + } + HttpClient::sendRequest(newUrl,_fTimeOutSec); + HttpRequestSplitter::reset(); + return 0; + } + checkCookie(_parser.getValues()); _totalBodySize = onResponseHeader(_parser.Url(), _parser.getValues()); diff --git a/src/Http/HttpRequestSplitter.cpp b/src/Http/HttpRequestSplitter.cpp index 4a6fd7e4..fe9779d0 100644 --- a/src/Http/HttpRequestSplitter.cpp +++ b/src/Http/HttpRequestSplitter.cpp @@ -59,24 +59,23 @@ void HttpRequestSplitter::input(const char *data,uint64_t len) { //_content_len == 0,这是请求头 const char *header_ptr = ptr; int64_t header_size = index - ptr; - ptr = index; _remain_data_size = len - (ptr - data); - _content_len = onRecvHeader(header_ptr, header_size); } - /* - * 恢复末尾字节 - */ - tail_ref = tail_tmp; - if(_remain_data_size <= 0){ //没有剩余数据,清空缓存 _remain_data.clear(); return; } + /* + * 恢复末尾字节 + * 移动到这来,目的是防止HttpRequestSplitter::reset()导致内存失效 + */ + tail_ref = tail_tmp; + if(_content_len == 0){ //尚未找到http头,缓存定位到剩余数据部分 string str(ptr,_remain_data_size); diff --git a/src/Rtsp/RtspPlayer.cpp b/src/Rtsp/RtspPlayer.cpp index 65ed6dbe..e803b051 100644 --- a/src/Rtsp/RtspPlayer.cpp +++ b/src/Rtsp/RtspPlayer.cpp @@ -198,7 +198,7 @@ void RtspPlayer::handleResDESCRIBE(const Parser& parser) { sendDescribe(); return; } - if(parser.Url() == "302"){ + if(parser.Url() == "302" || parser.Url() == "301"){ auto newUrl = parser["Location"]; if(newUrl.empty()){ throw std::runtime_error("未找到Location字段(跳转url)");