Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Z
ZLMediaKit
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
张翔宇
ZLMediaKit
Commits
c1f9dc10
Commit
c1f9dc10
authored
6 years ago
by
xiongziliang
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
完善http服务器功能
parent
d1607bcf
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
43 行增加
和
22 行删除
+43
-22
src/Http/HttpRequestSplitter.cpp
+5
-2
src/Http/HttpRequestSplitter.h
+5
-0
src/Http/HttpSession.cpp
+30
-18
src/Http/HttpSession.h
+3
-2
没有找到文件。
src/Http/HttpRequestSplitter.cpp
查看文件 @
c1f9dc10
...
...
@@ -46,4 +46,8 @@ splitPacket:
onRecvContent
(
_remain_data
);
_remain_data
.
clear
();
}
}
\ No newline at end of file
}
void
HttpRequestSplitter
::
setContentLen
(
int64_t
content_len
)
{
_content_len
=
content_len
;
}
This diff is collapsed.
Click to expand it.
src/Http/HttpRequestSplitter.h
查看文件 @
c1f9dc10
...
...
@@ -35,6 +35,11 @@ protected:
* @param content
*/
virtual
void
onRecvContent
(
const
string
&
content
)
=
0
;
/**
* 设置content len
*/
void
setContentLen
(
int64_t
content_len
);
private
:
string
_remain_data
;
int64_t
_content_len
=
0
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpSession.cpp
查看文件 @
c1f9dc10
...
...
@@ -618,27 +618,20 @@ inline bool HttpSession::emitHttpEvent(bool doInvoke){
return
consumed
;
}
inline
bool
HttpSession
::
Handle_Req_POST
(
int64_t
&
content_len
)
{
//////////////获取HTTP POST Content/////////////
GET_CONFIG_AND_REGISTER
(
uint32_t
,
reqSize
,
Config
::
Http
::
kMaxReqSize
);
int
realContentLen
=
m_parser
[
"Content-Length"
].
empty
()
?
-
1
:
atoi
(
m_parser
[
"Content-Length"
].
data
());
int
iContentLen
=
realContentLen
;
if
(
iContentLen
>
reqSize
){
//Content大小超过限制,那么我们把这个http post请求当做不限制content长度来处理
//这种情况下,用于文件post很有必要,否则内存可能溢出
iContentLen
=
-
1
;
}
GET_CONFIG_AND_REGISTER
(
uint64_t
,
maxReqSize
,
Config
::
Http
::
kMaxReqSize
);
GET_CONFIG_AND_REGISTER
(
int
,
maxReqCnt
,
Config
::
Http
::
kMaxReqCount
);
GET_CONFIG_AND_REGISTER
(
uint32_t
,
reqCnt
,
Config
::
Http
::
kMaxReqCount
);
bool
bClose
=
(
strcasecmp
(
m_parser
[
"Connection"
].
data
(),
"close"
)
==
0
)
||
(
++
m_iReqCnt
>
r
eqCnt
);
int64_t
totalContentLen
=
m_parser
[
"Content-Length"
].
empty
()
?
-
1
:
atoll
(
m_parser
[
"Content-Length"
].
data
()
);
bool
bClose
=
(
strcasecmp
(
m_parser
[
"Connection"
].
data
(),
"close"
)
==
0
)
||
(
++
m_iReqCnt
>
maxR
eqCnt
);
if
(
i
ContentLen
==
0
){
if
(
total
ContentLen
==
0
){
emitHttpEvent
(
true
);
return
!
bClose
;
}
if
(
iContentLen
>
0
){
if
(
totalContentLen
>
0
&&
totalContentLen
<
maxReqSize
){
//返回固定长度的content
content_len
=
i
ContentLen
;
content_len
=
total
ContentLen
;
auto
parserCopy
=
m_parser
;
m_contentCallBack
=
[
this
,
parserCopy
,
bClose
](
const
string
&
content
){
//恢复http头
...
...
@@ -659,10 +652,29 @@ inline bool HttpSession::Handle_Req_POST(int64_t &content_len) {
//返回不固定长度的content
content_len
=
-
1
;
auto
parserCopy
=
m_parser
;
m_contentCallBack
=
[
this
,
parserCopy
,
realContentLen
](
const
string
&
content
){
onRecvUnlimitedContent
(
parserCopy
,
content
,
realContentLen
);
//m_contentCallBack是可持续的,后面还要处理后续content数据
return
true
;
std
::
shared_ptr
<
int64_t
>
recvedContentLen
=
std
::
make_shared
<
int64_t
>
(
0
);
m_contentCallBack
=
[
this
,
parserCopy
,
totalContentLen
,
recvedContentLen
,
bClose
](
const
string
&
content
){
*
(
recvedContentLen
)
+=
content
.
size
();
onRecvUnlimitedContent
(
parserCopy
,
content
,
totalContentLen
,
*
(
recvedContentLen
));
if
(
*
(
recvedContentLen
)
<
totalContentLen
){
//数据还没接收完毕
//m_contentCallBack是可持续的,后面还要处理后续content数据
return
true
;
}
//数据接收完毕
if
(
!
bClose
){
//keep-alive类型连接
//content接收完毕,后续都是http header
setContentLen
(
0
);
return
false
;
}
//连接类型是close类型,收完content就关闭连接
shutdown
();
return
false
;
};
}
return
true
;
...
...
This diff is collapsed.
Click to expand it.
src/Http/HttpSession.h
查看文件 @
c1f9dc10
...
...
@@ -88,9 +88,10 @@ protected:
* 这个函数可用于处理大文件上传、http-flv推流
* @param header http请求头
* @param content content分片数据
* @param content_size content大小,如果为0则是不限长度content
* @param totalSize content总大小,如果为0则是不限长度content
* @param recvedSize 已收数据大小
*/
virtual
void
onRecvUnlimitedContent
(
const
Parser
&
header
,
const
string
&
content
,
int64_t
content_s
ize
){
virtual
void
onRecvUnlimitedContent
(
const
Parser
&
header
,
const
string
&
content
,
int64_t
totalSize
,
int64_t
recvedS
ize
){
WarnL
<<
"content数据长度过大,无法处理,请重载HttpSession::onRecvUnlimitedContent"
;
shutdown
();
}
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论