From d24aef50ba86123217fdba76ec7fd37cb71a40f8 Mon Sep 17 00:00:00 2001 From: winlin Date: Fri, 8 Jan 2016 18:17:37 +0800 Subject: [PATCH] for #369, support RTMP 302 api at protocol level. --- .../players/srs_player/release/srs_player.swf | Bin 6636 -> 6820 bytes .../players/srs_player/src/srs_player.as | 22 +++++++- trunk/src/kernel/srs_kernel_error.cpp | 3 +- trunk/src/kernel/srs_kernel_error.hpp | 3 ++ trunk/src/protocol/srs_protocol_utility.cpp | 4 +- trunk/src/protocol/srs_rtmp_stack.cpp | 51 ++++++++++++++++++ trunk/src/protocol/srs_rtmp_stack.hpp | 6 +++ 7 files changed, 86 insertions(+), 3 deletions(-) diff --git a/trunk/research/players/srs_player/release/srs_player.swf b/trunk/research/players/srs_player/release/srs_player.swf index ab7840f8b966952ba994a1d137a307c1891f3532..aef34079464baa174aacacb4c845a3b25f23f4db 100755 GIT binary patch literal 6820 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≷6F=JISY!s}9M@xJwyIj^7 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 diff --git a/trunk/research/players/srs_player/src/srs_player.as b/trunk/research/players/srs_player/src/srs_player.as index ed1bc3e27..272035a56 100755 --- a/trunk/research/players/srs_player/src/srs_player.as +++ b/trunk/research/players/srs_player/src/srs_player.as @@ -137,7 +137,7 @@ package var ms:NetStream = this.media_stream; if (!ms) { - log("stream is null, ignore timer event."); + //log("stream is null, ignore timer event."); return; } @@ -395,6 +395,26 @@ package } update_context_items(); } + + // reject by server, maybe redirect. + if (evt.info.code == "NetConnection.Connect.Rejected") { + // RTMP 302 redirect. + if (evt.info.hasOwnProperty("ex") && evt.info.ex.code == 302) { + var streamName:String = url.substr(url.lastIndexOf("/") + 1); + url = evt.info.ex.redirect + "/" + streamName; + log("Async RTMP 302 Redirect to: " + url); + + // notify server. + media_conn.call("Redirected", null, evt.info.ex.redirect); + + // do 302. + setTimeout(function(){ + log("Async RTMP 302 Redirected."); + js_call_play(url, _width, _height, buffer_time, max_buffer_time, volume); + }, 1000); + return; + } + } // TODO: FIXME: failed event. if (evt.info.code != "NetConnection.Connect.Success") { diff --git a/trunk/src/kernel/srs_kernel_error.cpp b/trunk/src/kernel/srs_kernel_error.cpp index 093706cef..addfb02d6 100644 --- a/trunk/src/kernel/srs_kernel_error.cpp +++ b/trunk/src/kernel/srs_kernel_error.cpp @@ -26,7 +26,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. bool srs_is_system_control_error(int error_code) { return error_code == ERROR_CONTROL_RTMP_CLOSE - || error_code == ERROR_CONTROL_REPUBLISH; + || error_code == ERROR_CONTROL_REPUBLISH + || error_code == ERROR_CONTROL_REDIRECT; } bool srs_is_client_gracefully_close(int error_code) diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index be34492d8..89852d04d 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -161,6 +161,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // // system control message, // not an error, but special control logic. +// +// connection is redirect to another server. +#define ERROR_CONTROL_REDIRECT 2997 // sys ctl: rtmp close stream, support replay. #define ERROR_CONTROL_RTMP_CLOSE 2998 // FMLE stop publish and republish. diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index 96e38fa06..1f76d94fe 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -306,7 +306,9 @@ string srs_generate_rtmp_url(string server, int port, string vhost, string app, ss << "...vhost..." << vhost; } - ss << "/" << stream; + if (!stream.empty()) { + ss << "/" << stream; + } return ss.str(); } diff --git a/trunk/src/protocol/srs_rtmp_stack.cpp b/trunk/src/protocol/srs_rtmp_stack.cpp index ce1e9ed97..b4c43dd53 100644 --- a/trunk/src/protocol/srs_rtmp_stack.cpp +++ b/trunk/src/protocol/srs_rtmp_stack.cpp @@ -2575,6 +2575,57 @@ int SrsRtmpServer::response_connect_app(SrsRequest *req, const char* server_ip) return ret; } +#define SRS_RTMP_REDIRECT_TIMEOUT 3000 +int SrsRtmpServer::redirect(SrsRequest* r, string host, int port, bool& accepted) +{ + int ret = ERROR_SUCCESS; + + if (true) { + string url = srs_generate_rtmp_url(host, port, r->vhost, r->app, ""); + + SrsAmf0Object* ex = SrsAmf0Any::object(); + ex->set("code", SrsAmf0Any::number(302)); + ex->set("redirect", SrsAmf0Any::str(url.c_str())); + + SrsOnStatusCallPacket* pkt = new SrsOnStatusCallPacket(); + + pkt->data->set(StatusLevel, SrsAmf0Any::str(StatusLevelError)); + pkt->data->set(StatusCode, SrsAmf0Any::str(StatusCodeConnectRejected)); + pkt->data->set(StatusDescription, SrsAmf0Any::str("RTMP 302 Redirect")); + pkt->data->set("ex", ex); + + if ((ret = protocol->send_and_free_packet(pkt, 0)) != ERROR_SUCCESS) { + srs_error("send redirect/rejected message failed. ret=%d", ret); + return ret; + } + srs_info("send redirect/rejected message success."); + } + + // client must response a call message. + // or we never know whether the client is ok to redirect. + protocol->set_recv_timeout(SRS_RTMP_REDIRECT_TIMEOUT * 1000); + if (true) { + SrsCommonMessage* msg = NULL; + SrsCallPacket* pkt = NULL; + if ((ret = expect_message(&msg, &pkt)) != ERROR_SUCCESS) { + // ignore any error of redirect response. + return ERROR_SUCCESS; + } + SrsAutoFree(SrsCommonMessage, msg); + SrsAutoFree(SrsCallPacket, pkt); + + string message; + if (pkt->arguments && pkt->arguments->is_string()) { + message = pkt->arguments->to_str(); + srs_info("confirm redirected to %s", message.c_str()); + accepted = true; + } + srs_info("get redirect response message"); + } + + return ret; +} + void SrsRtmpServer::response_connect_reject(SrsRequest* /*req*/, const char* desc) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/protocol/srs_rtmp_stack.hpp b/trunk/src/protocol/srs_rtmp_stack.hpp index 18a25cb62..583be52fb 100644 --- a/trunk/src/protocol/srs_rtmp_stack.hpp +++ b/trunk/src/protocol/srs_rtmp_stack.hpp @@ -929,6 +929,12 @@ public: * @param server_ip the ip of server. */ virtual int response_connect_app(SrsRequest* req, const char* server_ip = NULL); + /** + * redirect the connection to another rtmp server. + * @param the hostname or ip of target. + * @param whether the client accept the redirect. + */ + virtual int redirect(SrsRequest* r, std::string host, int port, bool& accepted); /** * reject the connect app request. */