mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
API: Parse fragment of URI. v5.0.106 (#3295)
* parse fragment of uri * adapt FMLE URL: 'rtmp://ip/app/app2#k=v/stream', then add more test case Co-authored-by: winlin <winlin@vip.126.com>
This commit is contained in:
parent
0e550d496b
commit
c5a0c5947f
6 changed files with 42 additions and 4 deletions
|
@ -8,6 +8,7 @@ The changelog for SRS.
|
||||||
|
|
||||||
## SRS 5.0 Changelog
|
## 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, 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-04, Asan: Set asan loging callback. v5.0.104
|
||||||
* v5.0, 2022-12-02, GB28181: Enable GB for CentOS 7 package. v5.0.103
|
* v5.0, 2022-12-02, GB28181: Enable GB for CentOS 7 package. v5.0.103
|
||||||
|
|
|
@ -9,6 +9,6 @@
|
||||||
|
|
||||||
#define VERSION_MAJOR 5
|
#define VERSION_MAJOR 5
|
||||||
#define VERSION_MINOR 0
|
#define VERSION_MINOR 0
|
||||||
#define VERSION_REVISION 105
|
#define VERSION_REVISION 106
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -931,7 +931,7 @@ SrsHttpUri::~SrsHttpUri()
|
||||||
|
|
||||||
srs_error_t SrsHttpUri::initialize(string url)
|
srs_error_t SrsHttpUri::initialize(string url)
|
||||||
{
|
{
|
||||||
schema = host = path = query = "";
|
schema = host = path = query = fragment_ = "";
|
||||||
url_ = url;
|
url_ = url;
|
||||||
|
|
||||||
// Replace the default vhost to a domain like string, or parse failed.
|
// 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);
|
path = get_uri_field(parsing_url, &hp_u, UF_PATH);
|
||||||
query = get_uri_field(parsing_url, &hp_u, UF_QUERY);
|
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);
|
username_ = get_uri_field(parsing_url, &hp_u, UF_USERINFO);
|
||||||
size_t pos = username_.find(":");
|
size_t pos = username_.find(":");
|
||||||
|
@ -1040,6 +1041,11 @@ string SrsHttpUri::get_query_by_key(std::string key)
|
||||||
return it->second;
|
return it->second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string SrsHttpUri::get_fragment()
|
||||||
|
{
|
||||||
|
return fragment_;
|
||||||
|
}
|
||||||
|
|
||||||
std::string SrsHttpUri::username()
|
std::string SrsHttpUri::username()
|
||||||
{
|
{
|
||||||
return username_;
|
return username_;
|
||||||
|
|
|
@ -580,6 +580,7 @@ private:
|
||||||
int port;
|
int port;
|
||||||
std::string path;
|
std::string path;
|
||||||
std::string query;
|
std::string query;
|
||||||
|
std::string fragment_;
|
||||||
std::string username_;
|
std::string username_;
|
||||||
std::string password_;
|
std::string password_;
|
||||||
std::map<std::string, std::string> query_values_;
|
std::map<std::string, std::string> query_values_;
|
||||||
|
@ -599,6 +600,7 @@ public:
|
||||||
virtual std::string get_path();
|
virtual std::string get_path();
|
||||||
virtual std::string get_query();
|
virtual std::string get_query();
|
||||||
virtual std::string get_query_by_key(std::string key);
|
virtual std::string get_query_by_key(std::string key);
|
||||||
|
virtual std::string get_fragment();
|
||||||
virtual std::string username();
|
virtual std::string username();
|
||||||
virtual std::string password();
|
virtual std::string password();
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -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);
|
fullUrl += param.empty() ? "" : (param.at(0) == '?' ? param : "?" + param);
|
||||||
|
|
||||||
// First, we covert the FMLE URL to standard URL:
|
// First, we covert the FMLE URL to standard URL:
|
||||||
// rtmp://ip/app/app2?k=v/stream
|
// rtmp://ip/app/app2?k=v/stream , or:
|
||||||
size_t pos_query = fullUrl.find("?");
|
// rtmp://ip/app/app2#k=v/stream
|
||||||
|
size_t pos_query = fullUrl.find_first_of("?#");
|
||||||
size_t pos_rslash = fullUrl.rfind("/");
|
size_t pos_rslash = fullUrl.rfind("/");
|
||||||
if (pos_rslash != string::npos && pos_query != string::npos && pos_query < pos_rslash) {
|
if (pos_rslash != string::npos && pos_query != string::npos && pos_query < pos_rslash) {
|
||||||
fullUrl = fullUrl.substr(0, pos_query) // rtmp://ip/app/app2
|
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();
|
port = uri.get_port();
|
||||||
stream = srs_path_basename(uri.get_path());
|
stream = srs_path_basename(uri.get_path());
|
||||||
param = uri.get_query().empty() ? "" : "?" + uri.get_query();
|
param = uri.get_query().empty() ? "" : "?" + uri.get_query();
|
||||||
|
param += uri.get_fragment().empty() ? "" : "#" + uri.get_fragment();
|
||||||
|
|
||||||
// Parse app without the prefix slash.
|
// Parse app without the prefix slash.
|
||||||
app = srs_path_dirname(uri.get_path());
|
app = srs_path_dirname(uri.get_path());
|
||||||
|
|
|
@ -3560,6 +3560,33 @@ VOID TEST(ProtocolRTMPTest, RTMPRequest)
|
||||||
req.update_auth(&req1);
|
req.update_auth(&req1);
|
||||||
EXPECT_TRUE(NULL != req.args);
|
EXPECT_TRUE(NULL != req.args);
|
||||||
EXPECT_TRUE(req1.args != 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)
|
VOID TEST(ProtocolRTMPTest, RTMPHandshakeBytes)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue