mirror of
https://github.com/ZLMediaKit/ZLMediaKit.git
synced 2024-11-22 10:40:05 +08:00
修复rtsp注册前未设置sdp的bug
rtsp鉴权放置在查找流之前,防止无谓的按需拉流
This commit is contained in:
parent
6d08e2a243
commit
db0611de91
@ -1 +1 @@
|
|||||||
Subproject commit eb3e28a6188fc8a7e5007215cc10a2b8c35c2cdd
|
Subproject commit e03997435ad388a7c169de7a4b17b76d773ab69b
|
@ -46,7 +46,7 @@ RtmpSession::~RtmpSession() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RtmpSession::onError(const SockException& err) {
|
void RtmpSession::onError(const SockException& err) {
|
||||||
DebugP(this) << err.what();
|
WarnP(this) << err.what();
|
||||||
|
|
||||||
//流量统计事件广播
|
//流量统计事件广播
|
||||||
GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold);
|
GET_CONFIG(uint32_t,iFlowThreshold,General::kFlowThreshold);
|
||||||
@ -143,6 +143,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) {
|
|||||||
}));
|
}));
|
||||||
dec.load<AMFValue>();/* NULL */
|
dec.load<AMFValue>();/* NULL */
|
||||||
_mediaInfo.parse(_strTcUrl + "/" + dec.load<std::string>());
|
_mediaInfo.parse(_strTcUrl + "/" + dec.load<std::string>());
|
||||||
|
_mediaInfo._schema = RTMP_SCHEMA;
|
||||||
|
|
||||||
auto onRes = [this,pToken](const string &err){
|
auto onRes = [this,pToken](const string &err){
|
||||||
auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,
|
auto src = dynamic_pointer_cast<RtmpMediaSource>(MediaSource::find(RTMP_SCHEMA,
|
||||||
@ -305,7 +306,6 @@ void RtmpSession::doPlayResponse(const string &err,const std::function<void(bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
//鉴权成功,查找媒体源并回复
|
//鉴权成功,查找媒体源并回复
|
||||||
_mediaInfo._schema = RTMP_SCHEMA;
|
|
||||||
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
|
weak_ptr<RtmpSession> weakSelf = dynamic_pointer_cast<RtmpSession>(shared_from_this());
|
||||||
MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf,cb](const MediaSource::Ptr &src){
|
MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf,cb](const MediaSource::Ptr &src){
|
||||||
auto rtmp_src = dynamic_pointer_cast<RtmpMediaSource>(src);
|
auto rtmp_src = dynamic_pointer_cast<RtmpMediaSource>(src);
|
||||||
@ -351,6 +351,7 @@ void RtmpSession::onCmd_play2(AMFDecoder &dec) {
|
|||||||
void RtmpSession::onCmd_play(AMFDecoder &dec) {
|
void RtmpSession::onCmd_play(AMFDecoder &dec) {
|
||||||
dec.load<AMFValue>();/* NULL */
|
dec.load<AMFValue>();/* NULL */
|
||||||
_mediaInfo.parse(_strTcUrl + "/" + dec.load<std::string>());
|
_mediaInfo.parse(_strTcUrl + "/" + dec.load<std::string>());
|
||||||
|
_mediaInfo._schema = RTMP_SCHEMA;
|
||||||
doPlay(dec);
|
doPlay(dec);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,6 +117,9 @@ public:
|
|||||||
//派生类设置该媒体源媒体描述信息
|
//派生类设置该媒体源媒体描述信息
|
||||||
_strSdp = sdp;
|
_strSdp = sdp;
|
||||||
_sdpAttr.load(sdp);
|
_sdpAttr.load(sdp);
|
||||||
|
if(_pRing){
|
||||||
|
regist();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override {
|
void onWrite(const RtpPacket::Ptr &rtppt, bool keyPos) override {
|
||||||
@ -136,7 +139,9 @@ public:
|
|||||||
strongSelf->onReaderChanged(size);
|
strongSelf->onReaderChanged(size);
|
||||||
});
|
});
|
||||||
onReaderChanged(0);
|
onReaderChanged(0);
|
||||||
regist();
|
if(!_strSdp.empty()){
|
||||||
|
regist();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_pRing->write(rtppt,keyPos);
|
_pRing->write(rtppt,keyPos);
|
||||||
checkNoneReader();
|
checkNoneReader();
|
||||||
|
@ -147,7 +147,8 @@ void RtspSession::onWholeRtspPacket(Parser &parser) {
|
|||||||
if(_strContentBase.empty() && strCmd != "GET"){
|
if(_strContentBase.empty() && strCmd != "GET"){
|
||||||
_strContentBase = parser.Url();
|
_strContentBase = parser.Url();
|
||||||
_mediaInfo.parse(parser.FullUrl());
|
_mediaInfo.parse(parser.FullUrl());
|
||||||
}
|
_mediaInfo._schema = RTSP_SCHEMA;
|
||||||
|
}
|
||||||
|
|
||||||
typedef void (RtspSession::*rtsp_request_handler)(const Parser &parser);
|
typedef void (RtspSession::*rtsp_request_handler)(const Parser &parser);
|
||||||
static unordered_map<string, rtsp_request_handler> s_handler_map;
|
static unordered_map<string, rtsp_request_handler> s_handler_map;
|
||||||
@ -257,7 +258,6 @@ void RtspSession::handleReq_RECORD(const Parser &parser){
|
|||||||
auto onRes = [this](const string &err){
|
auto onRes = [this](const string &err){
|
||||||
bool authSuccess = err.empty();
|
bool authSuccess = err.empty();
|
||||||
if(!authSuccess){
|
if(!authSuccess){
|
||||||
//第一次play是播放,否则是恢复播放。只对播放鉴权
|
|
||||||
sendRtspResponse("401 Unauthorized", {"Content-Type", "text/plain"}, err);
|
sendRtspResponse("401 Unauthorized", {"Content-Type", "text/plain"}, err);
|
||||||
shutdown(SockException(Err_shutdown,StrPrinter << "401 Unauthorized:" << err));
|
shutdown(SockException(Err_shutdown,StrPrinter << "401 Unauthorized:" << err));
|
||||||
return;
|
return;
|
||||||
@ -307,10 +307,46 @@ void RtspSession::handleReq_RECORD(const Parser &parser){
|
|||||||
}
|
}
|
||||||
|
|
||||||
void RtspSession::handleReq_Describe(const Parser &parser) {
|
void RtspSession::handleReq_Describe(const Parser &parser) {
|
||||||
_mediaInfo._schema = RTSP_SCHEMA;
|
|
||||||
auto authorization = parser["Authorization"];
|
|
||||||
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
||||||
MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf,authorization](const MediaSource::Ptr &src){
|
//该请求中的认证信息
|
||||||
|
auto authorization = parser["Authorization"];
|
||||||
|
onGetRealm invoker = [weakSelf,authorization](const string &realm){
|
||||||
|
auto strongSelf = weakSelf.lock();
|
||||||
|
if(!strongSelf){
|
||||||
|
//本对象已经销毁
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//切换到自己的线程然后执行
|
||||||
|
strongSelf->async([weakSelf,realm,authorization](){
|
||||||
|
auto strongSelf = weakSelf.lock();
|
||||||
|
if(!strongSelf){
|
||||||
|
//本对象已经销毁
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(realm.empty()){
|
||||||
|
//无需认证,回复sdp
|
||||||
|
strongSelf->onAuthSuccess();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//该流需要认证
|
||||||
|
strongSelf->onAuthUser(realm,authorization);
|
||||||
|
});
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
//广播是否需要认证事件
|
||||||
|
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm,
|
||||||
|
_mediaInfo,
|
||||||
|
invoker,
|
||||||
|
*this)){
|
||||||
|
//无人监听此事件,说明无需认证
|
||||||
|
invoker("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void RtspSession::onAuthSuccess() {
|
||||||
|
TraceP(this);
|
||||||
|
weak_ptr<RtspSession> weakSelf = dynamic_pointer_cast<RtspSession>(shared_from_this());
|
||||||
|
MediaSource::findAsync(_mediaInfo,weakSelf.lock(), true,[weakSelf](const MediaSource::Ptr &src){
|
||||||
auto strongSelf = weakSelf.lock();
|
auto strongSelf = weakSelf.lock();
|
||||||
if(!strongSelf){
|
if(!strongSelf){
|
||||||
return;
|
return;
|
||||||
@ -330,7 +366,7 @@ void RtspSession::handleReq_Describe(const Parser &parser) {
|
|||||||
if (strongSelf->_aTrackInfo.empty()) {
|
if (strongSelf->_aTrackInfo.empty()) {
|
||||||
//该流无效
|
//该流无效
|
||||||
strongSelf->send_StreamNotFound();
|
strongSelf->send_StreamNotFound();
|
||||||
strongSelf->shutdown(SockException(Err_shutdown,"can not find any availabe track in sdp"));
|
strongSelf->shutdown(SockException(Err_shutdown,"can not find any availabe track in sdp:" << strongSelf->_strSdp));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
strongSelf->_strSession = makeRandStr(12);
|
strongSelf->_strSession = makeRandStr(12);
|
||||||
@ -341,49 +377,13 @@ void RtspSession::handleReq_Describe(const Parser &parser) {
|
|||||||
track->_time_stamp = rtsp_src->getTimeStamp(track->_type);
|
track->_time_stamp = rtsp_src->getTimeStamp(track->_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
//该请求中的认证信息
|
strongSelf->sendRtspResponse("200 OK",
|
||||||
onGetRealm invoker = [weakSelf,authorization](const string &realm){
|
{"Content-Base",strongSelf->_strContentBase + "/",
|
||||||
auto strongSelf = weakSelf.lock();
|
"x-Accept-Retransmit","our-retransmit",
|
||||||
if(!strongSelf){
|
"x-Accept-Dynamic-Rate","1"
|
||||||
//本对象已经销毁
|
},strongSelf->_strSdp);
|
||||||
return;
|
|
||||||
}
|
|
||||||
//切换到自己的线程然后执行
|
|
||||||
strongSelf->async([weakSelf,realm,authorization](){
|
|
||||||
auto strongSelf = weakSelf.lock();
|
|
||||||
if(!strongSelf){
|
|
||||||
//本对象已经销毁
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if(realm.empty()){
|
|
||||||
//无需认证,回复sdp
|
|
||||||
strongSelf->onAuthSuccess();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
//该流需要认证
|
|
||||||
strongSelf->onAuthUser(realm,authorization);
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
//广播是否需要认证事件
|
|
||||||
if(!NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastOnGetRtspRealm,
|
|
||||||
strongSelf->_mediaInfo,
|
|
||||||
invoker,
|
|
||||||
*strongSelf)){
|
|
||||||
//无人监听此事件,说明无需认证
|
|
||||||
invoker("");
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
void RtspSession::onAuthSuccess() {
|
|
||||||
TraceP(this);
|
|
||||||
sendRtspResponse("200 OK",
|
|
||||||
{"Content-Base",_strContentBase + "/",
|
|
||||||
"x-Accept-Retransmit","our-retransmit",
|
|
||||||
"x-Accept-Dynamic-Rate","1"
|
|
||||||
},_strSdp);
|
|
||||||
}
|
|
||||||
void RtspSession::onAuthFailed(const string &realm,const string &why,bool close) {
|
void RtspSession::onAuthFailed(const string &realm,const string &why,bool close) {
|
||||||
GET_CONFIG(bool,authBasic,Rtsp::kAuthBasic);
|
GET_CONFIG(bool,authBasic,Rtsp::kAuthBasic);
|
||||||
if (!authBasic) {
|
if (!authBasic) {
|
||||||
|
Loading…
Reference in New Issue
Block a user