diff --git a/trunk/configure b/trunk/configure index 79d03d3b0..069fe97fe 100755 --- a/trunk/configure +++ b/trunk/configure @@ -516,7 +516,8 @@ if [ $SRS_LIBRTMP = YES ]; then fi # # utest, the unit-test cases of srs, base on gtest1.6 -MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_handshake" "srs_utest_buffer") +MODULE_FILES=("srs_utest" "srs_utest_amf0" "srs_utest_handshake" + "srs_utest_buffer" "srs_utest_protocol") ModuleLibIncs=(${SRS_OBJS} ${LibSTRoot}) ModuleLibFiles=(${LibSTfile} ${LibHttpParserfile} ${LibSSLfile}) MODULE_DEPENDS=("CORE" "KERNEL" "RTMP" "APP") diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 7044d1060..47425014c 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // current release version #define VERSION_MAJOR "0" #define VERSION_MINOR "9" -#define VERSION_REVISION "139" +#define VERSION_REVISION "140" #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION // server info. #define RTMP_SIG_SRS_KEY "SRS" diff --git a/trunk/src/rtmp/srs_protocol_rtmp.cpp b/trunk/src/rtmp/srs_protocol_rtmp.cpp index b3c3c1c78..2002a3222 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.cpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.cpp @@ -124,41 +124,6 @@ void SrsRequest::update_auth(SrsRequest* req) srs_info("update req of soruce for auth ok"); } -int SrsRequest::discovery_app() -{ - int ret = ERROR_SUCCESS; - - size_t pos = std::string::npos; - std::string url = tcUrl; - - if ((pos = url.find("://")) != std::string::npos) { - schema = url.substr(0, pos); - url = url.substr(schema.length() + 3); - srs_verbose("discovery schema=%s", schema.c_str()); - } - - if ((pos = url.find("/")) != std::string::npos) { - host = url.substr(0, pos); - url = url.substr(host.length() + 1); - srs_verbose("discovery host=%s", host.c_str()); - } - - port = RTMP_DEFAULT_PORT; - if ((pos = host.find(":")) != std::string::npos) { - port = host.substr(pos + 1); - host = host.substr(0, pos); - srs_verbose("discovery host=%s, port=%s", host.c_str(), port.c_str()); - } - - app = url; - vhost = host; - srs_vhost_resolve(vhost, app); - - strip(); - - return ret; -} - string SrsRequest::get_stream_url() { std::string url = ""; @@ -867,7 +832,10 @@ int SrsRtmpServer::connect_app(SrsRequest* req) srs_info("get connect app message params success."); - return req->discovery_app(); + srs_discovery_tc_url(req->tcUrl, req->schema, req->host, req->vhost, req->app, req->port); + req->strip(); + + return ret; } int SrsRtmpServer::set_window_ack_size(int ack_size) diff --git a/trunk/src/rtmp/srs_protocol_rtmp.hpp b/trunk/src/rtmp/srs_protocol_rtmp.hpp index e271a905e..177da5d9f 100644 --- a/trunk/src/rtmp/srs_protocol_rtmp.hpp +++ b/trunk/src/rtmp/srs_protocol_rtmp.hpp @@ -98,9 +98,8 @@ public: virtual void update_auth(SrsRequest* req); /** - * disconvery vhost/app from tcUrl. + * get the stream identify, vhost/app/stream. */ - virtual int discovery_app(); virtual std::string get_stream_url(); // strip url, user must strip when update the url. diff --git a/trunk/src/rtmp/srs_protocol_utility.cpp b/trunk/src/rtmp/srs_protocol_utility.cpp index 9f3c8e1ee..86448312d 100644 --- a/trunk/src/rtmp/srs_protocol_utility.cpp +++ b/trunk/src/rtmp/srs_protocol_utility.cpp @@ -29,9 +29,43 @@ using namespace std; #include #include +void srs_discovery_tc_url( + string tcUrl, + string& schema, string& host, string& vhost, + string& app, string& port +) { + size_t pos = std::string::npos; + std::string url = tcUrl; + + if ((pos = url.find("://")) != std::string::npos) { + schema = url.substr(0, pos); + url = url.substr(schema.length() + 3); + srs_info("discovery schema=%s", schema.c_str()); + } + + if ((pos = url.find("/")) != std::string::npos) { + host = url.substr(0, pos); + url = url.substr(host.length() + 1); + srs_info("discovery host=%s", host.c_str()); + } + + port = RTMP_DEFAULT_PORT; + if ((pos = host.find(":")) != std::string::npos) { + port = host.substr(pos + 1); + host = host.substr(0, pos); + srs_info("discovery host=%s, port=%s", host.c_str(), port.c_str()); + } + + app = url; + vhost = host; + srs_vhost_resolve(vhost, app); +} + void srs_vhost_resolve(string& vhost, string& app) { app = srs_string_replace(app, "...", "?"); + app = srs_string_replace(app, "&&", "?"); + app = srs_string_replace(app, "=", "?"); size_t pos = 0; if ((pos = app.find("?")) == std::string::npos) { @@ -41,15 +75,14 @@ void srs_vhost_resolve(string& vhost, string& app) std::string query = app.substr(pos + 1); app = app.substr(0, pos); - if ((pos = query.find("vhost?")) != std::string::npos - || (pos = query.find("vhost=")) != std::string::npos - || (pos = query.find("Vhost?")) != std::string::npos - || (pos = query.find("Vhost=")) != std::string::npos - ) { + if ((pos = query.find("vhost?")) != std::string::npos) { query = query.substr(pos + 6); if (!query.empty()) { vhost = query; } + if ((pos = vhost.find("?")) != std::string::npos) { + vhost = vhost.substr(0, pos); + } } } diff --git a/trunk/src/rtmp/srs_protocol_utility.hpp b/trunk/src/rtmp/srs_protocol_utility.hpp index bdbef98ba..2def50324 100644 --- a/trunk/src/rtmp/srs_protocol_utility.hpp +++ b/trunk/src/rtmp/srs_protocol_utility.hpp @@ -39,6 +39,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // the default chunk size for system. #define SRS_CONF_DEFAULT_CHUNK_SIZE 60000 +// parse the tcUrl, output the schema, host, vhost, app and port. +extern void srs_discovery_tc_url( + std::string tcUrl, + std::string& schema, std::string& host, std::string& vhost, + std::string& app, std::string& port +); + // resolve the vhost in query string // @param app, may contains the vhost in query string format: // app?vhost=request_vhost diff --git a/trunk/src/srs/srs.upp b/trunk/src/srs/srs.upp index de1f2c440..ebc1795a4 100755 --- a/trunk/src/srs/srs.upp +++ b/trunk/src/srs/srs.upp @@ -116,6 +116,8 @@ file ..\utest\srs_utest_buffer.cpp, ..\utest\srs_utest_handshake.hpp, ..\utest\srs_utest_handshake.cpp, + ..\utest\srs_utest_protocol.hpp, + ..\utest\srs_utest_protocol.cpp, research readonly separator, ..\..\research\librtmp\srs_detect_rtmp.c, ..\..\research\librtmp\srs_flv_injecter.c, diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp new file mode 100644 index 000000000..342a34f9c --- /dev/null +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -0,0 +1,113 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +#include + +using namespace std; + +#include +#include + +VOID TEST(ProtocolUtilityTest, VhostResolve) +{ + std::string vhost = "vhost"; + std::string app = "app"; + srs_vhost_resolve(vhost, app); + EXPECT_STREQ("vhost", vhost.c_str()); + EXPECT_STREQ("app", app.c_str()); + + app = "app?vhost=changed"; + srs_vhost_resolve(vhost, app); + EXPECT_STREQ("changed", vhost.c_str()); + EXPECT_STREQ("app", app.c_str()); + + app = "app?vhost=changed1&&query=true"; + srs_vhost_resolve(vhost, app); + EXPECT_STREQ("changed1", vhost.c_str()); + EXPECT_STREQ("app", app.c_str()); + + app = "app?other=true&&vhost=changed2&&query=true"; + srs_vhost_resolve(vhost, app); + EXPECT_STREQ("changed2", vhost.c_str()); + EXPECT_STREQ("app", app.c_str()); + + app = "app...other...true...vhost...changed3...query...true"; + srs_vhost_resolve(vhost, app); + EXPECT_STREQ("changed3", vhost.c_str()); + EXPECT_STREQ("app", app.c_str()); +} + +VOID TEST(ProtocolUtilityTest, DiscoveryTcUrl) +{ + std::string tcUrl; + std::string schema; std::string host; std::string vhost; + std::string app; std::string port; + + tcUrl = "rtmp://127.0.0.1:1935/live"; + srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("127.0.0.1", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("1935", port.c_str()); + + tcUrl = "rtmp://127.0.0.1:19351/live"; + srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("127.0.0.1", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("19351", port.c_str()); + + tcUrl = "rtmp://127.0.0.1:19351/live?vhost=demo"; + srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("demo", vhost.c_str()); + EXPECT_STREQ("live", app.c_str()); + EXPECT_STREQ("19351", port.c_str()); + + tcUrl = "rtmp://127.0.0.1:19351/live/show?vhost=demo"; + srs_discovery_tc_url(tcUrl, schema, host, vhost, app, port); + EXPECT_STREQ("rtmp", schema.c_str()); + EXPECT_STREQ("127.0.0.1", host.c_str()); + EXPECT_STREQ("demo", vhost.c_str()); + EXPECT_STREQ("live/show", app.c_str()); + EXPECT_STREQ("19351", port.c_str()); +} + +VOID TEST(ProtocolUtilityTest, GenerateTcUrl) +{ + string ip; string vhost; string app; string port; string tcUrl; + + ip = "127.0.0.1"; vhost = "__defaultVhost__"; app = "live"; port = "1935"; + tcUrl = srs_generate_tc_url(ip, vhost, app, port); + EXPECT_STREQ("rtmp://127.0.0.1/live", tcUrl.c_str()); + + ip = "127.0.0.1"; vhost = "demo"; app = "live"; port = "1935"; + tcUrl = srs_generate_tc_url(ip, vhost, app, port); + EXPECT_STREQ("rtmp://demo/live", tcUrl.c_str()); + + ip = "127.0.0.1"; vhost = "demo"; app = "live"; port = "19351"; + tcUrl = srs_generate_tc_url(ip, vhost, app, port); + EXPECT_STREQ("rtmp://demo:19351/live", tcUrl.c_str()); +} diff --git a/trunk/src/utest/srs_utest_protocol.hpp b/trunk/src/utest/srs_utest_protocol.hpp new file mode 100644 index 000000000..dcfedb2d4 --- /dev/null +++ b/trunk/src/utest/srs_utest_protocol.hpp @@ -0,0 +1,35 @@ +/* +The MIT License (MIT) + +Copyright (c) 2013-2014 winlin + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#ifndef SRS_UTEST_PROTOCOL_HPP +#define SRS_UTEST_PROTOCOL_HPP + +/* +#include +*/ +#include + +#include +#include + +#endif