diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 1b22f02567..cd363edd11 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-12-08, Merge [#3295](https://github.com/ossrs/srs/pull/3295): API: Parse fragment of URI. v5.0.106 * v5.0, 2022-12-04, Cygwin: Enable gb28181 for Windows. v5.0.105 * v5.0, 2022-12-04, Asan: Set asan loging callback. v5.0.104 * v5.0, 2022-12-02, GB28181: Enable GB for CentOS 7 package. v5.0.103 diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 968e7c692c..00a875889f 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 105 +#define VERSION_REVISION 106 #endif diff --git a/trunk/src/protocol/srs_protocol_http_stack.cpp b/trunk/src/protocol/srs_protocol_http_stack.cpp index 91405506d1..fcb0bf898e 100644 --- a/trunk/src/protocol/srs_protocol_http_stack.cpp +++ b/trunk/src/protocol/srs_protocol_http_stack.cpp @@ -931,7 +931,7 @@ SrsHttpUri::~SrsHttpUri() srs_error_t SrsHttpUri::initialize(string url) { - schema = host = path = query = ""; + schema = host = path = query = fragment_ = ""; url_ = url; // Replace the default vhost to a domain like string, or parse failed. @@ -979,6 +979,7 @@ srs_error_t SrsHttpUri::initialize(string url) path = get_uri_field(parsing_url, &hp_u, UF_PATH); query = get_uri_field(parsing_url, &hp_u, UF_QUERY); + fragment_ = get_uri_field(parsing_url, &hp_u, UF_FRAGMENT); username_ = get_uri_field(parsing_url, &hp_u, UF_USERINFO); size_t pos = username_.find(":"); @@ -1040,6 +1041,11 @@ string SrsHttpUri::get_query_by_key(std::string key) return it->second; } +std::string SrsHttpUri::get_fragment() +{ + return fragment_; +} + std::string SrsHttpUri::username() { return username_; diff --git a/trunk/src/protocol/srs_protocol_http_stack.hpp b/trunk/src/protocol/srs_protocol_http_stack.hpp index 6360179540..7608618b04 100644 --- a/trunk/src/protocol/srs_protocol_http_stack.hpp +++ b/trunk/src/protocol/srs_protocol_http_stack.hpp @@ -580,6 +580,7 @@ class SrsHttpUri int port; std::string path; std::string query; + std::string fragment_; std::string username_; std::string password_; std::map query_values_; @@ -599,6 +600,7 @@ class SrsHttpUri virtual std::string get_path(); virtual std::string get_query(); virtual std::string get_query_by_key(std::string key); + virtual std::string get_fragment(); virtual std::string username(); virtual std::string password(); private: diff --git a/trunk/src/protocol/srs_protocol_utility.cpp b/trunk/src/protocol/srs_protocol_utility.cpp index c52d41b906..b9edc67d84 100644 --- a/trunk/src/protocol/srs_protocol_utility.cpp +++ b/trunk/src/protocol/srs_protocol_utility.cpp @@ -53,8 +53,9 @@ void srs_discovery_tc_url(string tcUrl, string& schema, string& host, string& vh fullUrl += param.empty() ? "" : (param.at(0) == '?' ? param : "?" + param); // First, we covert the FMLE URL to standard URL: - // rtmp://ip/app/app2?k=v/stream - size_t pos_query = fullUrl.find("?"); + // rtmp://ip/app/app2?k=v/stream , or: + // rtmp://ip/app/app2#k=v/stream + size_t pos_query = fullUrl.find_first_of("?#"); size_t pos_rslash = fullUrl.rfind("/"); if (pos_rslash != string::npos && pos_query != string::npos && pos_query < pos_rslash) { fullUrl = fullUrl.substr(0, pos_query) // rtmp://ip/app/app2 @@ -81,6 +82,7 @@ void srs_discovery_tc_url(string tcUrl, string& schema, string& host, string& vh port = uri.get_port(); stream = srs_path_basename(uri.get_path()); param = uri.get_query().empty() ? "" : "?" + uri.get_query(); + param += uri.get_fragment().empty() ? "" : "#" + uri.get_fragment(); // Parse app without the prefix slash. app = srs_path_dirname(uri.get_path()); diff --git a/trunk/src/utest/srs_utest_protocol.cpp b/trunk/src/utest/srs_utest_protocol.cpp index 1b15e9b206..7ca61d1467 100644 --- a/trunk/src/utest/srs_utest_protocol.cpp +++ b/trunk/src/utest/srs_utest_protocol.cpp @@ -3560,6 +3560,33 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest) req.update_auth(&req1); EXPECT_TRUE(NULL != req.args); EXPECT_TRUE(req1.args != req.args); + + param = ""; + req.stream = "livestream"; + srs_discovery_tc_url("rtmp://std.ossrs.net/live#b=2", + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); + EXPECT_STREQ("#b=2", param.c_str()); + + param = ""; + req.stream = "livestream"; + srs_discovery_tc_url("rtmp://std.ossrs.net/live?a=1#b=2", + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); + EXPECT_STREQ("?a=1#b=2", param.c_str()); + + param = ""; + srs_discovery_tc_url("rtmp://std.ossrs.net/live?a=1&c=3#b=2", + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); + EXPECT_STREQ("?a=1&c=3#b=2", param.c_str()); + + param = ""; + srs_discovery_tc_url("rtmp://std.ossrs.net/live?a=1&c=3#b=2#d=4", + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); + EXPECT_STREQ("?a=1&c=3#b=2#d=4", param.c_str()); + + param = ""; + srs_discovery_tc_url("rtmp://std.ossrs.net/live?a=1#e=5&c=3#b=2#d=4", + req.schema, req.host, req.vhost, req.app, req.stream, req.port, param); + EXPECT_STREQ("?a=1#e=5&c=3#b=2#d=4", param.c_str()); } VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes)