mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
Merge branch '4.0release' into develop
This commit is contained in:
commit
9385f2b80b
10 changed files with 232 additions and 72 deletions
|
@ -10,6 +10,8 @@
|
|||
#include "srt_log.hpp"
|
||||
#include <vector>
|
||||
|
||||
#include <srs_protocol_utility.hpp>
|
||||
#include <srs_kernel_utility.hpp>
|
||||
#include <srs_app_config.hpp>
|
||||
|
||||
bool is_streamid_valid(const std::string& streamid) {
|
||||
|
@ -24,20 +26,20 @@ bool is_streamid_valid(const std::string& streamid) {
|
|||
|
||||
int mode;
|
||||
std::string subpath;
|
||||
std::string vhost;
|
||||
|
||||
bool ret = get_streamid_info(streamid, mode, subpath);
|
||||
// Parse the stream info from streamid, see https://github.com/ossrs/srs/issues/2893
|
||||
bool ret = get_streamid_info(streamid, mode, vhost, subpath);
|
||||
if (!ret) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if ((mode != PUSH_SRT_MODE) && (mode != PULL_SRT_MODE)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::string> info_vec;
|
||||
string_split(subpath, "/", info_vec);
|
||||
|
||||
if (info_vec.size() < 2) {//it must be appname/stream at least.
|
||||
// TODO: FIXME: Should fail at parsing the original SRT URL.
|
||||
if (info_vec.size() != 2) {
|
||||
srt_log_warn("path format must be appname/stream?key=value...");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -69,12 +71,11 @@ bool get_key_value(const std::string& info, std::string& key, std::string& value
|
|||
return true;
|
||||
}
|
||||
|
||||
//eg. streamid=#!::h:live/livestream,m:publish
|
||||
bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_subpath) {
|
||||
std::vector<std::string> info_vec;
|
||||
std::string real_streamid;
|
||||
|
||||
mode = PUSH_SRT_MODE;
|
||||
// See streamid of https://github.com/ossrs/srs/issues/2893
|
||||
// TODO: FIMXE: We should parse SRT streamid to URL object, rather than a HTTP url subpath.
|
||||
bool get_streamid_info(const std::string& streamid, int& mode, std::string& vhost, std::string& url_subpath)
|
||||
{
|
||||
mode = PULL_SRT_MODE;
|
||||
|
||||
size_t pos = streamid.find("#!::");
|
||||
if (pos != 0) {
|
||||
|
@ -86,36 +87,82 @@ bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_
|
|||
url_subpath = streamid;
|
||||
return true;
|
||||
}
|
||||
|
||||
//SRT url supports multiple QueryStrings, which are passed to RTMP to realize authentication and other capabilities
|
||||
//@see https://github.com/ossrs/srs/issues/2893
|
||||
std::string params;
|
||||
std::string real_streamid;
|
||||
real_streamid = streamid.substr(4);
|
||||
|
||||
string_split(real_streamid, ",", info_vec);
|
||||
if (info_vec.size() < 2) {
|
||||
// Compatible with previous auth querystring, like this one:
|
||||
// srt://127.0.0.1:10080?streamid=#!::h=live/livestream?secret=xxx,m=publish
|
||||
real_streamid = srs_string_replace(real_streamid, "?", ",");
|
||||
|
||||
std::map<std::string, std::string> query;
|
||||
srs_parse_query_string(real_streamid, query);
|
||||
for (std::map<std::string, std::string>::iterator it = query.begin(); it != query.end(); ++it) {
|
||||
if (it->first == "h") {
|
||||
std::string host = it->second;
|
||||
|
||||
size_t r0 = host.find("/");
|
||||
size_t r1 = host.rfind("/");
|
||||
if (r0 != std::string::npos && r0 != std::string::npos) {
|
||||
// Compatible with previous style, see https://github.com/ossrs/srs/issues/2893#compatible
|
||||
// srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=publish
|
||||
// srt://127.0.0.1:10080?streamid=#!::h=live/livestream,m=request
|
||||
// srt://127.0.0.1:10080?streamid=#!::h=srs.srt.com.cn/live/livestream,m=publish
|
||||
if (r0 != r1) {
|
||||
// We got vhost in host.
|
||||
url_subpath = host.substr(r0 + 1);
|
||||
host = host.substr(0, r0);
|
||||
|
||||
params.append("vhost=");
|
||||
params.append(host);
|
||||
params.append("&");
|
||||
vhost = host;
|
||||
} else {
|
||||
// Only stream in host.
|
||||
url_subpath = host;
|
||||
}
|
||||
} else {
|
||||
// New URL style, see https://github.com/ossrs/srs/issues/2893#solution
|
||||
// srt://host.com:10080?streamid=#!::h=host.com,r=app/stream,key1=value1,key2=value2
|
||||
// srt://1.2.3.4:10080?streamid=#!::h=host.com,r=app/stream,key1=value1,key2=value2
|
||||
// srt://1.2.3.4:10080?streamid=#!::r=app/stream,key1=value1,key2=value2
|
||||
params.append("vhost=");
|
||||
params.append(host);
|
||||
params.append("&");
|
||||
vhost = host;
|
||||
}
|
||||
} else if (it->first == "r") {
|
||||
url_subpath = it->second;
|
||||
} else if (it->first == "m") {
|
||||
std::string mode_str = it->second; // support m=publish or m=request
|
||||
std::transform(it->second.begin(), it->second.end(), mode_str.begin(), ::tolower);
|
||||
if (mode_str == "publish") {
|
||||
mode = PUSH_SRT_MODE;
|
||||
} else if (mode_str == "request") {
|
||||
mode = PULL_SRT_MODE;
|
||||
} else {
|
||||
srt_log_warn("unknown mode_str:%s", mode_str.c_str());
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
params.append(it->first);
|
||||
params.append("=");
|
||||
params.append(it->second);
|
||||
params.append("&");
|
||||
}
|
||||
}
|
||||
|
||||
if (url_subpath.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (size_t index = 0; index < info_vec.size(); index++) {
|
||||
std::string key;
|
||||
std::string value;
|
||||
|
||||
bool ret = get_key_value(info_vec[index], key, value);
|
||||
if (!ret) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (key == "h") {
|
||||
url_subpath = value;//eg. h=live/stream
|
||||
} else if (key == "m") {
|
||||
std::string mode_str = string_lower(value);//m=publish or m=request
|
||||
if (mode_str == "publish") {
|
||||
mode = PUSH_SRT_MODE;
|
||||
} else if (mode_str == "request") {
|
||||
mode = PULL_SRT_MODE;
|
||||
} else {
|
||||
mode = PUSH_SRT_MODE;
|
||||
}
|
||||
} else {//not suport
|
||||
continue;
|
||||
}
|
||||
if (!params.empty()) {
|
||||
url_subpath.append("?");
|
||||
url_subpath.append(params);
|
||||
url_subpath.pop_back(); // remove last '&'
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -123,19 +170,16 @@ bool get_streamid_info(const std::string& streamid, int& mode, std::string& url_
|
|||
|
||||
srt_conn::srt_conn(SRTSOCKET conn_fd, const std::string& streamid):_conn_fd(conn_fd),
|
||||
_streamid(streamid),
|
||||
write_fail_cnt_(0) {
|
||||
get_streamid_info(streamid, _mode, _url_subpath);
|
||||
write_fail_cnt_(0)
|
||||
{
|
||||
get_streamid_info(streamid, _mode, _vhost, _url_subpath);
|
||||
|
||||
_update_timestamp = now_ms();
|
||||
|
||||
std::vector<std::string> path_vec;
|
||||
|
||||
string_split(_url_subpath, "/", path_vec);
|
||||
if (path_vec.size() >= 3) {
|
||||
_vhost = path_vec[0];
|
||||
} else {
|
||||
|
||||
if (_vhost.empty()) {
|
||||
_vhost = "__default_host__";
|
||||
}
|
||||
|
||||
srt_log_trace("srt connect construct streamid:%s, mode:%d, subpath:%s, vhost:%s",
|
||||
streamid.c_str(), _mode, _url_subpath.c_str(), _vhost.c_str());
|
||||
}
|
||||
|
@ -175,6 +219,17 @@ std::string srt_conn::get_streamid() {
|
|||
return _streamid;
|
||||
}
|
||||
|
||||
std::string srt_conn::get_path() {
|
||||
if (!_url_path.empty()) {
|
||||
return _url_path;
|
||||
}
|
||||
|
||||
size_t pos = _url_subpath.find("?");
|
||||
_url_path = (pos != std::string::npos) ? _url_subpath.substr(0, pos) : _url_subpath;
|
||||
|
||||
return _url_path;
|
||||
}
|
||||
|
||||
std::string srt_conn::get_subpath() {
|
||||
return _url_subpath;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue