From cf8b6f6b9172e18d3cf900739d56912a7ebac0ea Mon Sep 17 00:00:00 2001 From: xiongziliang <771730766@qq.com> Date: Mon, 5 Feb 2018 17:25:22 +0800 Subject: [PATCH] =?UTF-8?q?=E9=89=B4=E6=9D=83=E5=A4=B1=E8=B4=A5=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E9=94=99=E8=AF=AF=E6=8F=8F=E8=BF=B0=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Common/config.h | 2 +- src/Http/HttpSession.cpp | 13 ++++++------- src/Rtmp/RtmpSession.cpp | 28 ++++++++++++++-------------- src/Rtsp/RtspSession.cpp | 18 +++++++++++------- tests/test_server.cpp | 6 ++++-- 5 files changed, 36 insertions(+), 31 deletions(-) diff --git a/src/Common/config.h b/src/Common/config.h index c3458c21..e3c2321c 100644 --- a/src/Common/config.h +++ b/src/Common/config.h @@ -86,7 +86,7 @@ extern const char kBroadcastOnRtspAuth[]; //鉴权结果回调对象 -typedef std::function AuthInvoker; +typedef std::function AuthInvoker; //收到rtmp推流事件广播,通过该事件控制推流鉴权 extern const char kBroadcastRtmpPublish[]; diff --git a/src/Http/HttpSession.cpp b/src/Http/HttpSession.cpp index a3e8a669..8e9b05e3 100644 --- a/src/Http/HttpSession.cpp +++ b/src/Http/HttpSession.cpp @@ -202,10 +202,9 @@ inline bool HttpSession::checkLiveFlvStream(){ return true; } - auto onRes = [this,mediaSrc](bool authSuccess){ + auto onRes = [this,mediaSrc](bool authSuccess,const string &err){ if(!authSuccess){ - string status = "401 Unauthorized"; - sendResponse(status.data(), makeHttpHeader(true,status.size()),status); + sendResponse("401 Unauthorized", makeHttpHeader(true,err.size()),err); shutdown(); return ; } @@ -276,23 +275,23 @@ inline bool HttpSession::checkLiveFlvStream(){ }; weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); - Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ + Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - strongSelf->async([weakSelf,onRes,authSuccess](){ + strongSelf->async([weakSelf,onRes,authSuccess,err](){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - onRes(authSuccess); + onRes(authSuccess,err); }); }; auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,info,invoker); if(!flag){ //该事件无人监听,默认不鉴权 - onRes(true); + onRes(true,""); } return true; } diff --git a/src/Rtmp/RtmpSession.cpp b/src/Rtmp/RtmpSession.cpp index ab75bc0c..ace4bce8 100644 --- a/src/Rtmp/RtmpSession.cpp +++ b/src/Rtmp/RtmpSession.cpp @@ -130,7 +130,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) { dec.load();/* NULL */ m_mediaInfo.parse(m_strTcUrl + "/" + dec.load()); - auto onRes = [this](bool authSuccess){ + auto onRes = [this](bool authSuccess,const string &err){ auto src = dynamic_pointer_cast(MediaSource::find(RTMP_SCHEMA, m_mediaInfo.m_vhost, m_mediaInfo.m_app, @@ -140,12 +140,12 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) { AMFValue status(AMF_OBJECT); status.set("level", ok ? "status" : "error"); status.set("code", ok ? "NetStream.Publish.Start" : (authSuccess ? "NetStream.Publish.BadName" : "NetStream.Publish.BadAuth")); - status.set("description", ok ? "Started publishing stream." : (authSuccess ? "Already publishing." : "Auth failed")); + status.set("description", ok ? "Started publishing stream." : (authSuccess ? "Already publishing." : err.data())); status.set("clientid", "0"); sendReply("onStatus", nullptr, status); if (!ok) { WarnL << "onPublish:" - << (authSuccess ? "Already publishing:" : "Auth failed:") + << (authSuccess ? "Already publishing:" : err.data()) << m_mediaInfo.m_vhost << " " << m_mediaInfo.m_app << " " << m_mediaInfo.m_streamid << endl; @@ -157,17 +157,17 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) { }; weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); - Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool success){ + Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool success,const string &err){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - strongSelf->async([weakSelf,onRes,success](){ + strongSelf->async([weakSelf,onRes,success,err](){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - onRes(success); + onRes(success,err); }); }; auto flag = NoticeCenter::Instance().emitEvent(Config::Broadcast::kBroadcastRtmpPublish, @@ -175,7 +175,7 @@ void RtmpSession::onCmd_publish(AMFDecoder &dec) { invoker); if(!flag){ //该事件无人监听,默认鉴权成功 - onRes(true); + onRes(true,""); } } @@ -189,7 +189,7 @@ void RtmpSession::onCmd_deleteStream(AMFDecoder &dec) { } void RtmpSession::doPlay(AMFDecoder &dec){ - auto onRes = [this](bool authSuccess) { + auto onRes = [this](bool authSuccess,const string &err) { auto src = dynamic_pointer_cast(MediaSource::find(RTMP_SCHEMA, m_mediaInfo.m_vhost, m_mediaInfo.m_app, @@ -207,13 +207,13 @@ void RtmpSession::doPlay(AMFDecoder &dec){ AMFValue status(AMF_OBJECT); status.set("level", ok ? "status" : "error"); status.set("code", ok ? "NetStream.Play.Reset" : (authSuccess ? "NetStream.Play.StreamNotFound" : "NetStream.Play.BadAuth")); - status.set("description", ok ? "Resetting and playing." : (authSuccess ? "No such stream." : "Auth failed")); + status.set("description", ok ? "Resetting and playing." : (authSuccess ? "No such stream." : err.data())); status.set("details", m_mediaInfo.m_streamid); status.set("clientid", "0"); sendReply("onStatus", nullptr, status); if (!ok) { WarnL << "onPlayed:" - << (authSuccess ? "No such stream:" : "Auth failed:") + << (authSuccess ? "No such stream:" : err.data()) << m_mediaInfo.m_vhost << " " << m_mediaInfo.m_app << " " << m_mediaInfo.m_streamid @@ -292,23 +292,23 @@ void RtmpSession::doPlay(AMFDecoder &dec){ }; weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); - Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ + Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - strongSelf->async([weakSelf,onRes,authSuccess](){ + strongSelf->async([weakSelf,onRes,authSuccess,err](){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - onRes(authSuccess); + onRes(authSuccess,err); }); }; auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker); if(!flag){ //该事件无人监听,默认不鉴权 - onRes(true); + onRes(true,""); } } void RtmpSession::onCmd_play2(AMFDecoder &dec) { diff --git a/src/Rtsp/RtspSession.cpp b/src/Rtsp/RtspSession.cpp index 4a0a9020..a04bb8c7 100644 --- a/src/Rtsp/RtspSession.cpp +++ b/src/Rtsp/RtspSession.cpp @@ -641,7 +641,7 @@ bool RtspSession::handleReq_Play() { send_SessionNotFound(); return false; } - auto onRes = [this](bool authSuccess){ + auto onRes = [this](bool authSuccess,const string &err){ char response[2 * 1024]; m_pcBuf = response; if(!authSuccess && m_bFirstPlay){ @@ -650,8 +650,12 @@ bool RtspSession::handleReq_Play() { "RTSP/1.0 401 Unauthorized\r\n" "CSeq: %d\r\n" "Server: %s-%0.2f(build in %s)\r\n" - "%s\r\n", - m_iCseq, SERVER_NAME, RTSP_VERSION, RTSP_BUILDTIME, dateHeader().data()); + "%s" + "Content-Type: text/plain\r\n" + "Content-Length: %d\r\n\r\n%s", + m_iCseq, SERVER_NAME, + RTSP_VERSION, RTSP_BUILDTIME, + dateHeader().data(),(int)err.size(),err.data()); send(m_pcBuf,n); shutdown(); return; @@ -730,23 +734,23 @@ bool RtspSession::handleReq_Play() { }; weak_ptr weakSelf = dynamic_pointer_cast(shared_from_this()); - Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess){ + Broadcast::AuthInvoker invoker = [weakSelf,onRes](bool authSuccess,const string &err){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - strongSelf->async([weakSelf,onRes,authSuccess](){ + strongSelf->async([weakSelf,onRes,authSuccess,err](){ auto strongSelf = weakSelf.lock(); if(!strongSelf){ return; } - onRes(authSuccess); + onRes(authSuccess,err); }); }; auto flag = NoticeCenter::Instance().emitEvent(Broadcast::kBroadcastMediaPlayed,m_mediaInfo,invoker); if(!flag){ //该事件无人监听,默认不鉴权 - onRes(true); + onRes(true,""); } return true; } diff --git a/tests/test_server.cpp b/tests/test_server.cpp index fa769386..99b523a1 100644 --- a/tests/test_server.cpp +++ b/tests/test_server.cpp @@ -112,14 +112,16 @@ static onceToken s_token([](){ NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastRtmpPublish,[](BroadcastRtmpPublishArgs){ InfoL << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ; EventPoller::Instance().async([invoker](){ - invoker(true); + //invoker(true,"");//鉴权成功 + invoker(false,"this is auth failed message");//鉴权失败 }); }); NoticeCenter::Instance().addListener(nullptr,Config::Broadcast::kBroadcastMediaPlayed,[](BroadcastMediaPlayedArgs){ InfoL << args.m_schema << " " << args.m_vhost << " " << args.m_app << " " << args.m_streamid << " " << args.m_param_strs ; EventPoller::Instance().async([invoker](){ - invoker(true); + //invoker(true,"");//鉴权成功 + invoker(false,"this is auth failed message");//鉴权失败 }); });