mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-26 12:37:09 +08:00
完善http服务器对不固定长度body的支持
This commit is contained in:
parent
40c2326950
commit
eb89a3e504
@ -52,14 +52,14 @@ public:
|
|||||||
virtual ~HttpBody(){}
|
virtual ~HttpBody(){}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 剩余数据大小
|
* 剩余数据大小,如果返回>=INT64_MAX, 那么就不设置content-length
|
||||||
*/
|
*/
|
||||||
virtual uint64_t remainSize() { return 0;};
|
virtual uint64_t remainSize() { return 0;};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 读取一定字节数,返回大小可能小于size
|
* 读取一定字节数,返回大小可能小于size
|
||||||
* @param size 请求大小
|
* @param size 请求大小
|
||||||
* @return 字节对象
|
* @return 字节对象,如果读完了,那么请返回nullptr
|
||||||
*/
|
*/
|
||||||
virtual Buffer::Ptr readData(uint32_t size) { return nullptr;};
|
virtual Buffer::Ptr readData(uint32_t size) { return nullptr;};
|
||||||
};
|
};
|
||||||
|
@ -156,7 +156,7 @@ bool HttpSession::checkWebSocket(){
|
|||||||
|
|
||||||
auto res_cb = [this,headerOut](){
|
auto res_cb = [this,headerOut](){
|
||||||
_flv_over_websocket = true;
|
_flv_over_websocket = true;
|
||||||
sendResponse("101 Switching Protocols",false,nullptr,headerOut,nullptr,false);
|
sendResponse("101 Switching Protocols",false,nullptr,headerOut,nullptr, true);
|
||||||
};
|
};
|
||||||
|
|
||||||
//判断是否为websocket-flv
|
//判断是否为websocket-flv
|
||||||
@ -219,7 +219,7 @@ bool HttpSession::checkLiveFlvStream(const function<void()> &cb){
|
|||||||
|
|
||||||
if(!cb) {
|
if(!cb) {
|
||||||
//找到rtmp源,发送http头,负载后续发送
|
//找到rtmp源,发送http头,负载后续发送
|
||||||
sendResponse("200 OK", false, "video/x-flv",KeyValue(),nullptr,false);
|
sendResponse("200 OK", false, "video/x-flv",KeyValue(),nullptr,true);
|
||||||
}else{
|
}else{
|
||||||
cb();
|
cb();
|
||||||
}
|
}
|
||||||
@ -313,7 +313,7 @@ void HttpSession::sendResponse(const char *pcStatus,
|
|||||||
const char *pcContentType,
|
const char *pcContentType,
|
||||||
const HttpSession::KeyValue &header,
|
const HttpSession::KeyValue &header,
|
||||||
const HttpBody::Ptr &body,
|
const HttpBody::Ptr &body,
|
||||||
bool set_content_len ){
|
bool is_http_flv ){
|
||||||
GET_CONFIG(string,charSet,Http::kCharSet);
|
GET_CONFIG(string,charSet,Http::kCharSet);
|
||||||
GET_CONFIG(uint32_t,keepAliveSec,Http::kKeepAliveSecond);
|
GET_CONFIG(uint32_t,keepAliveSec,Http::kKeepAliveSecond);
|
||||||
|
|
||||||
@ -322,16 +322,14 @@ void HttpSession::sendResponse(const char *pcStatus,
|
|||||||
if (body && body->remainSize()) {
|
if (body && body->remainSize()) {
|
||||||
//有body,获取body大小
|
//有body,获取body大小
|
||||||
size = body->remainSize();
|
size = body->remainSize();
|
||||||
if (size >= INT64_MAX) {
|
|
||||||
//不固定长度的body,那么不设置content-length字段
|
|
||||||
size = -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!set_content_len || size == -1){
|
if(is_http_flv){
|
||||||
//如果是不定长度body,或者不设置conten-length,
|
//http-flv直播是Keep-Alive类型
|
||||||
//那么一定是Keep-Alive类型
|
|
||||||
bClose = false;
|
bClose = false;
|
||||||
|
}else if(size >= INT64_MAX){
|
||||||
|
//不固定长度的body,那么发送完body后应该关闭socket,以便浏览器做下载完毕的判断
|
||||||
|
bClose = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
HttpSession::KeyValue &headerOut = const_cast<HttpSession::KeyValue &>(header);
|
HttpSession::KeyValue &headerOut = const_cast<HttpSession::KeyValue &>(header);
|
||||||
@ -348,8 +346,8 @@ void HttpSession::sendResponse(const char *pcStatus,
|
|||||||
headerOut.emplace("Access-Control-Allow-Credentials", "true");
|
headerOut.emplace("Access-Control-Allow-Credentials", "true");
|
||||||
}
|
}
|
||||||
|
|
||||||
if(set_content_len && size >= 0){
|
if(!is_http_flv && size >= 0 && size < INT64_MAX){
|
||||||
//文件长度为定值或者,且不是http-flv强制设置Content-Length
|
//文件长度为固定值,且不是http-flv强制设置Content-Length
|
||||||
headerOut["Content-Length"] = StrPrinter << size << endl;
|
headerOut["Content-Length"] = StrPrinter << size << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ private:
|
|||||||
void sendNotFound(bool bClose);
|
void sendNotFound(bool bClose);
|
||||||
void sendResponse(const char *pcStatus, bool bClose, const char *pcContentType = nullptr,
|
void sendResponse(const char *pcStatus, bool bClose, const char *pcContentType = nullptr,
|
||||||
const HttpSession::KeyValue &header = HttpSession::KeyValue(),
|
const HttpSession::KeyValue &header = HttpSession::KeyValue(),
|
||||||
const HttpBody::Ptr &body = nullptr,bool set_content_len = true);
|
const HttpBody::Ptr &body = nullptr,bool is_http_flv = false);
|
||||||
|
|
||||||
//设置socket标志
|
//设置socket标志
|
||||||
void setSocketFlags();
|
void setSocketFlags();
|
||||||
|
Loading…
Reference in New Issue
Block a user