1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

refine the config structure, compatible with SRS1/2

This commit is contained in:
winlin 2015-08-29 18:40:18 +08:00
parent a79e19599c
commit 7ef3ff90c0
6 changed files with 424 additions and 225 deletions

View file

@ -0,0 +1,35 @@
listen 1935;
pid ./objs/srs.pid;
srs_log_tank console;
srs_log_level trace;
max_connections 1000;
daemon off;
http_api {
enabled on;
listen 1985;
crossdomain on;
raw_api {
enabled on;
allow_reload on;
allow_query on;
}
}
# for SRS1.
http_stream {
enabled on;
listen 8080;
dir ./objs/nginx/html;
}
vhost __defaultVhost__ {
# for SRS2.
refer github.com github.io;
refer_publish github.com github.io;
refer_play github.com github.io;
# for SRS1.
http {
enabled on;
mount [vhost]/hls;
dir ./objs/nginx/html/hls;
}
}

View file

@ -229,6 +229,81 @@ stream_caster {
# for which cannot identify the required vhost. # for which cannot identify the required vhost.
vhost __defaultVhost__ { vhost __defaultVhost__ {
} }
# the vhost for antisuck.
vhost refer.anti_suck.com {
# refer hotlink-denial.
refer {
# whether enable the refer hotlink-denial.
# default: off.
enabled on;
# the common refer for play and publish.
# if the page url of client not in the refer, access denied.
# if not specified this field, allow all.
# default: not specified.
all github.com github.io;
# refer for publish clients specified.
# the common refer is not overrided by this.
# if not specified this field, allow all.
# default: not specified.
publish github.com github.io;
# refer for play clients specified.
# the common refer is not overrided by this.
# if not specified this field, allow all.
# default: not specified.
play github.com github.io;
}
}
# vhost for bandwidth check
# generally, the bandcheck vhost must be: bandcheck.srs.com,
# or need to modify the vhost of client.
vhost bandcheck.srs.com {
enabled on;
chunk_size 65000;
# bandwidth check config.
bandcheck {
# whether support bandwidth check,
# default: off.
enabled on;
# the key for server to valid,
# if invalid key, server disconnect and abort the bandwidth check.
key "35c9b402c12a7246868752e2878f7e0e";
# the interval in seconds for bandwidth check,
# server donot allow new test request.
# default: 30
interval 30;
# the max available check bandwidth in kbps.
# to avoid attack of bandwidth check.
# default: 1000
limit_kbps 4000;
}
}
# the security to allow or deny clients. # the security to allow or deny clients.
vhost security.srs.com { vhost security.srs.com {
@ -952,25 +1027,6 @@ vhost stream.control.com {
publish_normal_timeout 7000; publish_normal_timeout 7000;
} }
# the vhost for antisuck.
vhost refer.anti_suck.com {
# the common refer for play and publish.
# if the page url of client not in the refer, access denied.
# if not specified this field, allow all.
# default: not specified.
refer github.com github.io;
# refer for publish clients specified.
# the common refer is not overrided by this.
# if not specified this field, allow all.
# default: not specified.
refer_publish github.com github.io;
# refer for play clients specified.
# the common refer is not overrided by this.
# if not specified this field, allow all.
# default: not specified.
refer_play github.com github.io;
}
# the vhost which forward publish streams. # the vhost which forward publish streams.
vhost same.vhost.forward.srs.com { vhost same.vhost.forward.srs.com {
# forward all publish stream to the specified server. # forward all publish stream to the specified server.
@ -1003,31 +1059,6 @@ vhost exec.srs.com {
} }
} }
# vhost for bandwidth check
# generally, the bandcheck vhost must be: bandcheck.srs.com,
# or need to modify the vhost of client.
vhost bandcheck.srs.com {
enabled on;
chunk_size 65000;
# bandwidth check config.
bandcheck {
# whether support bandwidth check,
# default: off.
enabled on;
# the key for server to valid,
# if invalid key, server disconnect and abort the bandwidth check.
key "35c9b402c12a7246868752e2878f7e0e";
# the interval in seconds for bandwidth check,
# server donot allow new test request.
# default: 30
interval 30;
# the max available check bandwidth in kbps.
# to avoid attack of bandwidth check.
# default: 1000
limit_kbps 4000;
}
}
# set the chunk size of vhost. # set the chunk size of vhost.
vhost chunksize.srs.com { vhost chunksize.srs.com {
# the default chunk size is 128, max is 65536, # the default chunk size is 128, max is 65536,

View file

@ -43,26 +43,6 @@ stream_caster {
rtp_port_min 57200; rtp_port_min 57200;
rtp_port_max 57300; rtp_port_max 57300;
} }
stream_caster {
enabled off;
caster mpegts_over_udp;
output rtmp://127.0.0.1/live/livestream;
listen 8935;
}
stream_caster {
enabled off;
caster rtsp;
output rtmp://127.0.0.1/[app]/[stream];
listen 554;
rtp_port_min 57200;
rtp_port_max 57300;
}
stream_caster {
enabled off;
caster flv;
output rtmp://127.0.0.1/[app]/[stream];
listen 8936;
}
vhost __defaultVhost__ { vhost __defaultVhost__ {
} }
vhost vhost.srs.com { vhost vhost.srs.com {
@ -98,9 +78,12 @@ vhost vhost.srs.com {
publish_1stpkt_timeout 20000; publish_1stpkt_timeout 20000;
publish_normal_timeout 7000; publish_normal_timeout 7000;
refer github.com github.io; refer {
refer_publish github.com github.io; enabled off;
refer_play github.com github.io; all github.com github.io;
publish github.com github.io;
play github.com github.io;
}
bandcheck { bandcheck {
enabled off; enabled off;

View file

@ -105,15 +105,10 @@ using namespace _srs_internal;
// the interval in seconds for bandwidth check // the interval in seconds for bandwidth check
#define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000 #define SRS_CONF_DEFAULT_BANDWIDTH_LIMIT_KBPS 1000
#define SRS_CONF_DEFAULT_HTTP_MOUNT "[vhost]/"
#define SRS_CONF_DEFAULT_HTTP_REMUX_MOUNT "[vhost]/[app]/[stream].flv" #define SRS_CONF_DEFAULT_HTTP_REMUX_MOUNT "[vhost]/[app]/[stream].flv"
#define SRS_CONF_DEFAULT_HTTP_DIR SRS_CONF_DEFAULT_HLS_PATH #define SRS_CONF_DEFAULT_HTTP_DIR SRS_CONF_DEFAULT_HLS_PATH
#define SRS_CONF_DEFAULT_HTTP_AUDIO_FAST_CACHE 0 #define SRS_CONF_DEFAULT_HTTP_AUDIO_FAST_CACHE 0
#define SRS_CONF_DEFAULT_HTTP_STREAM_PORT "8080"
#define SRS_CONF_DEFAULT_HTTP_API_PORT "1985"
#define SRS_CONF_DEFAULT_HTTP_API_CROSSDOMAIN true
#define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_ENABLED false #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_ENABLED false
#define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INTERVAL 9.9 #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_INTERVAL 9.9
#define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_URL "http://"SRS_CONSTS_LOCALHOST":8085/api/v1/servers" #define SRS_CONF_DEFAULT_HTTP_HEAETBEAT_URL "http://"SRS_CONSTS_LOCALHOST":8085/api/v1/servers"
@ -228,6 +223,37 @@ SrsConfDirective* SrsConfDirective::get(string _name, string _arg0)
return NULL; return NULL;
} }
SrsConfDirective* SrsConfDirective::get_or_create(string n)
{
SrsConfDirective* conf = get(n);
if (!conf) {
conf = new SrsConfDirective();
conf->name = n;
directives.push_back(conf);
}
return conf;
}
SrsConfDirective* SrsConfDirective::get_or_create(string n, string a0)
{
SrsConfDirective* conf = get_or_create(n);
if (conf->arg0() == a0) {
return conf;
}
// update a0.
if (!conf->args.empty()) {
conf->args.erase(conf->args.begin());
}
conf->args.insert(conf->args.begin(), a0);
return conf;
}
bool SrsConfDirective::is_vhost() bool SrsConfDirective::is_vhost()
{ {
return name == "vhost"; return name == "vhost";
@ -644,6 +670,12 @@ int SrsConfig::reload()
return ret; return ret;
} }
srs_info("config reloader parse file success."); srs_info("config reloader parse file success.");
// transform config to compatible with previous style of config.
if ((ret = srs_config_transform_vhost(conf.root)) != ERROR_SUCCESS) {
srs_error("transform config failed. ret=%d", ret);
return ret;
}
if ((ret = conf.check_config()) != ERROR_SUCCESS) { if ((ret = conf.check_config()) != ERROR_SUCCESS) {
srs_error("ignore config reloader check config failed. ret=%d", ret); srs_error("ignore config reloader check config failed. ret=%d", ret);
@ -958,20 +990,7 @@ int SrsConfig::reload_vhost(SrsConfDirective* old_root)
srs_trace("vhost %s reload min_latency success.", vhost.c_str()); srs_trace("vhost %s reload min_latency success.", vhost.c_str());
} }
// http, only one per vhost.
if (!srs_directive_equals(new_vhost->get("http"), old_vhost->get("http"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((ret = subscribe->on_reload_vhost_http_updated()) != ERROR_SUCCESS) {
srs_error("vhost %s notify subscribes http failed. ret=%d", vhost.c_str(), ret);
return ret;
}
}
srs_trace("vhost %s reload http success.", vhost.c_str());
}
// http_static, only one per vhost. // http_static, only one per vhost.
// @remark, http_static introduced as alias of http.
if (!srs_directive_equals(new_vhost->get("http_static"), old_vhost->get("http_static"))) { if (!srs_directive_equals(new_vhost->get("http_static"), old_vhost->get("http_static"))) {
for (it = subscribes.begin(); it != subscribes.end(); ++it) { for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it; ISrsReloadHandler* subscribe = *it;
@ -1239,17 +1258,8 @@ int SrsConfig::reload_http_stream(SrsConfDirective* old_root)
// ENABLED => DISABLED // ENABLED => DISABLED
// ENABLED => ENABLED (modified) // ENABLED => ENABLED (modified)
SrsConfDirective* new_http_stream = root->get("http_stream"); SrsConfDirective* new_http_stream = root->get("http_server");
// http_stream rename to http_server in SRS2. SrsConfDirective* old_http_stream = old_root->get("http_server");
if (!new_http_stream) {
new_http_stream = root->get("http_server");
}
SrsConfDirective* old_http_stream = old_root->get("http_stream");
// http_stream rename to http_server in SRS2.
if (!old_http_stream) {
old_http_stream = root->get("http_server");
}
// DISABLED => ENABLED // DISABLED => ENABLED
if (!get_http_stream_enabled(old_http_stream) && get_http_stream_enabled(new_http_stream)) { if (!get_http_stream_enabled(old_http_stream) && get_http_stream_enabled(new_http_stream)) {
@ -1524,6 +1534,12 @@ int SrsConfig::parse_options(int argc, char** argv)
ret = parse_file(config_file.c_str()); ret = parse_file(config_file.c_str());
// transform config to compatible with previous style of config.
if ((ret = srs_config_transform_vhost(root)) != ERROR_SUCCESS) {
srs_error("transform config failed. ret=%d", ret);
return ret;
}
if (test_conf) { if (test_conf) {
// the parse_file never check the config, // the parse_file never check the config,
// we check it when user requires check config file. // we check it when user requires check config file.
@ -1735,7 +1751,7 @@ int SrsConfig::global_to_json(SrsAmf0Object* obj)
sobj->set("forward", SrsAmf0Any::boolean(get_forward(dir->name))); sobj->set("forward", SrsAmf0Any::boolean(get_forward(dir->name)));
sobj->set("security", SrsAmf0Any::boolean(get_security_enabled(dir->name))); sobj->set("security", SrsAmf0Any::boolean(get_security_enabled(dir->name)));
sobj->set("refer", SrsAmf0Any::boolean(get_refer(dir->name) || get_refer_play(dir->name) || get_refer_publish(dir->name))); sobj->set("refer", SrsAmf0Any::boolean(get_refer_enabled(dir->name)));
sobj->set("mr", SrsAmf0Any::boolean(get_mr_enabled(dir->name))); sobj->set("mr", SrsAmf0Any::boolean(get_mr_enabled(dir->name)));
sobj->set("min_latency", SrsAmf0Any::boolean(get_realtime_enabled(dir->name))); sobj->set("min_latency", SrsAmf0Any::boolean(get_realtime_enabled(dir->name)));
@ -1905,13 +1921,22 @@ int SrsConfig::vhost_to_json(SrsConfDirective* vhost, SrsAmf0Object* obj)
// refer // refer
if ((dir = vhost->get("refer")) != NULL) { if ((dir = vhost->get("refer")) != NULL) {
obj->set("refer", dir->dumps_args()); SrsAmf0Object* refer = SrsAmf0Any::object();
} obj->set("refer", refer);
if ((dir = vhost->get("refer_publish")) != NULL) {
obj->set("refer_publish", dir->dumps_args()); for (int i = 0; i < (int)dir->directives.size(); i++) {
} SrsConfDirective* sdir = dir->directives.at(i);
if ((dir = vhost->get("refer_play")) != NULL) {
obj->set("refer_play", dir->dumps_args()); if (sdir->name == "enabled") {
refer->set("enabled", sdir->dumps_arg0_to_boolean());
} else if (sdir->name == "all") {
refer->set("all", sdir->dumps_args());
} else if (sdir->name == "publish") {
refer->set("publish", sdir->dumps_args());
} else if (sdir->name == "play") {
refer->set("play", sdir->dumps_args());
}
}
} }
// bandcheck // bandcheck
@ -2495,7 +2520,7 @@ int SrsConfig::check_config()
&& n != "srs_log_tank" && n != "srs_log_level" && n != "srs_log_file" && n != "srs_log_tank" && n != "srs_log_level" && n != "srs_log_file"
&& n != "max_connections" && n != "daemon" && n != "heartbeat" && n != "max_connections" && n != "daemon" && n != "heartbeat"
&& n != "http_api" && n != "stats" && n != "vhost" && n != "pithy_print_ms" && n != "http_api" && n != "stats" && n != "vhost" && n != "pithy_print_ms"
&& n != "http_stream" && n != "http_server" && n != "stream_caster" && n != "http_server" && n != "stream_caster"
&& n != "utc_time" && n != "utc_time"
) { ) {
ret = ERROR_SYSTEM_CONFIG_INVALID; ret = ERROR_SYSTEM_CONFIG_INVALID;
@ -2504,7 +2529,7 @@ int SrsConfig::check_config()
} }
} }
if (true) { if (true) {
SrsConfDirective* conf = get_http_api(); SrsConfDirective* conf = root->get("http_api");
for (int i = 0; conf && i < (int)conf->directives.size(); i++) { for (int i = 0; conf && i < (int)conf->directives.size(); i++) {
SrsConfDirective* obj = conf->at(i); SrsConfDirective* obj = conf->at(i);
string n = obj->name; string n = obj->name;
@ -2527,7 +2552,7 @@ int SrsConfig::check_config()
} }
} }
if (true) { if (true) {
SrsConfDirective* conf = get_http_stream(); SrsConfDirective* conf = root->get("http_server");
for (int i = 0; conf && i < (int)conf->directives.size(); i++) { for (int i = 0; conf && i < (int)conf->directives.size(); i++) {
string n = conf->at(i)->name; string n = conf->at(i)->name;
if (n != "enabled" && n != "listen" && n != "dir") { if (n != "enabled" && n != "listen" && n != "dir") {
@ -2751,8 +2776,7 @@ int SrsConfig::check_config()
&& n != "mode" && n != "origin" && n != "token_traverse" && n != "vhost" && n != "mode" && n != "origin" && n != "token_traverse" && n != "vhost"
&& n != "dvr" && n != "ingest" && n != "hls" && n != "http_hooks" && n != "dvr" && n != "ingest" && n != "hls" && n != "http_hooks"
&& n != "gop_cache" && n != "queue_length" && n != "gop_cache" && n != "queue_length"
&& n != "refer" && n != "refer_publish" && n != "refer_play" && n != "refer" && n != "forward" && n != "transcode" && n != "bandcheck"
&& n != "forward" && n != "transcode" && n != "bandcheck"
&& n != "time_jitter" && n != "mix_correct" && n != "time_jitter" && n != "mix_correct"
&& n != "atc" && n != "atc_auto" && n != "atc" && n != "atc_auto"
&& n != "debug_srs_upnode" && n != "debug_srs_upnode"
@ -2760,8 +2784,7 @@ int SrsConfig::check_config()
&& n != "tcp_nodelay" && n != "send_min_interval" && n != "reduce_sequence_header" && n != "tcp_nodelay" && n != "send_min_interval" && n != "reduce_sequence_header"
&& n != "publish_1stpkt_timeout" && n != "publish_normal_timeout" && n != "publish_1stpkt_timeout" && n != "publish_normal_timeout"
&& n != "security" && n != "http_remux" && n != "security" && n != "http_remux"
&& n != "http" && n != "http_static" && n != "http_static" && n != "hds" && n != "exec"
&& n != "hds" && n != "exec"
) { ) {
ret = ERROR_SYSTEM_CONFIG_INVALID; ret = ERROR_SYSTEM_CONFIG_INVALID;
srs_error("unsupported vhost directive %s, ret=%d", n.c_str(), ret); srs_error("unsupported vhost directive %s, ret=%d", n.c_str(), ret);
@ -2779,6 +2802,15 @@ int SrsConfig::check_config()
return ret; return ret;
} }
} }
} else if (n == "refer") {
for (int j = 0; j < (int)conf->directives.size(); j++) {
string m = conf->at(j)->name.c_str();
if (m != "enabled" && m != "all" && m != "publish" && m != "play") {
ret = ERROR_SYSTEM_CONFIG_INVALID;
srs_error("unsupported vhost refer directive %s, ret=%d", m.c_str(), ret);
return ret;
}
}
} else if (n == "exec") { } else if (n == "exec") {
for (int j = 0; j < (int)conf->directives.size(); j++) { for (int j = 0; j < (int)conf->directives.size(); j++) {
string m = conf->at(j)->name.c_str(); string m = conf->at(j)->name.c_str();
@ -2806,7 +2838,7 @@ int SrsConfig::check_config()
return ret; return ret;
} }
} }
} else if (n == "http" || n == "http_static") { } else if (n == "http_static") {
for (int j = 0; j < (int)conf->directives.size(); j++) { for (int j = 0; j < (int)conf->directives.size(); j++) {
string m = conf->at(j)->name.c_str(); string m = conf->at(j)->name.c_str();
if (m != "enabled" && m != "mount" && m != "dir") { if (m != "enabled" && m != "mount" && m != "dir") {
@ -3372,37 +3404,77 @@ double SrsConfig::get_queue_length(string vhost)
return ::atoi(conf->arg0().c_str()); return ::atoi(conf->arg0().c_str());
} }
SrsConfDirective* SrsConfig::get_refer(string vhost) bool SrsConfig::get_refer_enabled(string vhost)
{ {
static bool DEFAULT = false;
SrsConfDirective* conf = get_vhost(vhost); SrsConfDirective* conf = get_vhost(vhost);
if (!conf) { if (!conf) {
return NULL; return DEFAULT;
} }
return conf->get("refer"); conf = conf->get("refer");
if (!conf) {
return DEFAULT;
}
conf = conf->get("enabled");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
return SRS_CONF_PERFER_FALSE(conf->arg0());
}
SrsConfDirective* SrsConfig::get_refer(string vhost)
{
static SrsConfDirective* DEFAULT = NULL;
SrsConfDirective* conf = get_vhost(vhost);
if (!conf) {
return DEFAULT;
}
conf = conf->get("refer");
if (!conf) {
return DEFAULT;
}
return conf->get("all");
} }
SrsConfDirective* SrsConfig::get_refer_play(string vhost) SrsConfDirective* SrsConfig::get_refer_play(string vhost)
{ {
static SrsConfDirective* DEFAULT = NULL;
SrsConfDirective* conf = get_vhost(vhost); SrsConfDirective* conf = get_vhost(vhost);
if (!conf) { if (!conf) {
return NULL; return DEFAULT;
} }
return conf->get("refer_play"); conf = conf->get("refer");
if (!conf) {
return DEFAULT;
}
return conf->get("play");
} }
SrsConfDirective* SrsConfig::get_refer_publish(string vhost) SrsConfDirective* SrsConfig::get_refer_publish(string vhost)
{ {
static SrsConfDirective* DEFAULT = NULL;
SrsConfDirective* conf = get_vhost(vhost); SrsConfDirective* conf = get_vhost(vhost);
if (!conf) { if (!conf) {
return NULL; return DEFAULT;
} }
return conf->get("refer_publish"); conf = conf->get("refer");
if (!conf) {
return DEFAULT;
}
return conf->get("publish");
} }
int SrsConfig::get_chunk_size(string vhost) int SrsConfig::get_chunk_size(string vhost)
@ -5046,24 +5118,21 @@ int SrsConfig::get_dvr_time_jitter(string vhost)
bool SrsConfig::get_http_api_enabled() bool SrsConfig::get_http_api_enabled()
{ {
SrsConfDirective* conf = get_http_api(); SrsConfDirective* conf = root->get("http_api");
return get_http_api_enabled(conf); return get_http_api_enabled(conf);
} }
SrsConfDirective* SrsConfig::get_http_api()
{
return root->get("http_api");
}
bool SrsConfig::get_http_api_enabled(SrsConfDirective* conf) bool SrsConfig::get_http_api_enabled(SrsConfDirective* conf)
{ {
static bool DEFAULT = false;
if (!conf) { if (!conf) {
return false; return DEFAULT;
} }
conf = conf->get("enabled"); conf = conf->get("enabled");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return false; return DEFAULT;
} }
return SRS_CONF_PERFER_FALSE(conf->arg0()); return SRS_CONF_PERFER_FALSE(conf->arg0());
@ -5071,15 +5140,17 @@ bool SrsConfig::get_http_api_enabled(SrsConfDirective* conf)
string SrsConfig::get_http_api_listen() string SrsConfig::get_http_api_listen()
{ {
SrsConfDirective* conf = get_http_api(); static string DEFAULT = "1985";
SrsConfDirective* conf = root->get("http_api");
if (!conf) { if (!conf) {
return SRS_CONF_DEFAULT_HTTP_API_PORT; return DEFAULT;
} }
conf = conf->get("listen"); conf = conf->get("listen");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_API_PORT; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();
@ -5087,15 +5158,17 @@ string SrsConfig::get_http_api_listen()
bool SrsConfig::get_http_api_crossdomain() bool SrsConfig::get_http_api_crossdomain()
{ {
SrsConfDirective* conf = get_http_api(); static bool DEFAULT = true;
SrsConfDirective* conf = root->get("http_api");
if (!conf) { if (!conf) {
return SRS_CONF_DEFAULT_HTTP_API_CROSSDOMAIN; return DEFAULT;
} }
conf = conf->get("crossdomain"); conf = conf->get("crossdomain");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_API_CROSSDOMAIN; return DEFAULT;
} }
return SRS_CONF_PERFER_TRUE(conf->arg0()); return SRS_CONF_PERFER_TRUE(conf->arg0());
@ -5105,7 +5178,7 @@ bool SrsConfig::get_raw_api()
{ {
static bool DEFAULT = false; static bool DEFAULT = false;
SrsConfDirective* conf = get_http_api(); SrsConfDirective* conf = root->get("http_api");
if (!conf) { if (!conf) {
return DEFAULT; return DEFAULT;
} }
@ -5127,7 +5200,7 @@ bool SrsConfig::get_raw_api_allow_reload()
{ {
static bool DEFAULT = false; static bool DEFAULT = false;
SrsConfDirective* conf = get_http_api(); SrsConfDirective* conf = root->get("http_api");
if (!conf) { if (!conf) {
return DEFAULT; return DEFAULT;
} }
@ -5149,7 +5222,7 @@ bool SrsConfig::get_raw_api_allow_query()
{ {
static bool DEFAULT = false; static bool DEFAULT = false;
SrsConfDirective* conf = get_http_api(); SrsConfDirective* conf = root->get("http_api");
if (!conf) { if (!conf) {
return DEFAULT; return DEFAULT;
} }
@ -5169,30 +5242,21 @@ bool SrsConfig::get_raw_api_allow_query()
bool SrsConfig::get_http_stream_enabled() bool SrsConfig::get_http_stream_enabled()
{ {
SrsConfDirective* conf = get_http_stream(); SrsConfDirective* conf = root->get("http_server");
return get_http_stream_enabled(conf); return get_http_stream_enabled(conf);
} }
SrsConfDirective* SrsConfig::get_http_stream()
{
SrsConfDirective* conf = root->get("http_stream");
// http_stream renamed to http_server in SRS2.
if (!conf) {
conf = root->get("http_server");
}
return conf;
}
bool SrsConfig::get_http_stream_enabled(SrsConfDirective* conf) bool SrsConfig::get_http_stream_enabled(SrsConfDirective* conf)
{ {
static bool DEFAULT = false;
if (!conf) { if (!conf) {
return false; return DEFAULT;
} }
conf = conf->get("enabled"); conf = conf->get("enabled");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return false; return DEFAULT;
} }
return SRS_CONF_PERFER_FALSE(conf->arg0()); return SRS_CONF_PERFER_FALSE(conf->arg0());
@ -5200,15 +5264,17 @@ bool SrsConfig::get_http_stream_enabled(SrsConfDirective* conf)
string SrsConfig::get_http_stream_listen() string SrsConfig::get_http_stream_listen()
{ {
SrsConfDirective* conf = get_http_stream(); static string DEFAULT = "8080";
SrsConfDirective* conf = root->get("http_server");
if (!conf) { if (!conf) {
return SRS_CONF_DEFAULT_HTTP_STREAM_PORT; return DEFAULT;
} }
conf = conf->get("listen"); conf = conf->get("listen");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_STREAM_PORT; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();
@ -5216,18 +5282,16 @@ string SrsConfig::get_http_stream_listen()
string SrsConfig::get_http_stream_dir() string SrsConfig::get_http_stream_dir()
{ {
SrsConfDirective* conf = get_http_stream(); static string DEFAULT = "./objs/nginx/html";
SrsConfDirective* conf = root->get("http_server");
if (!conf) { if (!conf) {
return SRS_CONF_DEFAULT_HTTP_DIR; return DEFAULT;
} }
conf = conf->get("dir"); conf = conf->get("dir");
if (!conf) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_DIR; return DEFAULT;
}
if (conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_DIR;
} }
return conf->arg0(); return conf->arg0();
@ -5235,23 +5299,21 @@ string SrsConfig::get_http_stream_dir()
bool SrsConfig::get_vhost_http_enabled(string vhost) bool SrsConfig::get_vhost_http_enabled(string vhost)
{ {
SrsConfDirective* vconf = get_vhost(vhost); static bool DEFAULT = false;
if (!vconf) {
return false; SrsConfDirective* conf = get_vhost(vhost);
if (!conf) {
return DEFAULT;
} }
SrsConfDirective* conf = vconf->get("http"); conf = conf->get("http_static");
if (!conf) { if (!conf) {
conf = vconf->get("http_static"); return DEFAULT;
}
if (!conf) {
return false;
} }
conf = conf->get("enabled"); conf = conf->get("enabled");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return false; return DEFAULT;
} }
return SRS_CONF_PERFER_FALSE(conf->arg0()); return SRS_CONF_PERFER_FALSE(conf->arg0());
@ -5259,22 +5321,21 @@ bool SrsConfig::get_vhost_http_enabled(string vhost)
string SrsConfig::get_vhost_http_mount(string vhost) string SrsConfig::get_vhost_http_mount(string vhost)
{ {
SrsConfDirective* vconf = get_vhost(vhost); static string DEFAULT = "[vhost]/";
if (!vconf) {
return SRS_CONF_DEFAULT_HTTP_MOUNT; SrsConfDirective* conf = get_vhost(vhost);
if (!conf) {
return DEFAULT;
} }
SrsConfDirective* conf = vconf->get("http"); conf = conf->get("http_static");
if (!conf) { if (!conf) {
conf = vconf->get("http_static"); return DEFAULT;
if (!conf) {
return SRS_CONF_DEFAULT_HTTP_MOUNT;
}
} }
conf = conf->get("mount"); conf = conf->get("mount");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_MOUNT; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();
@ -5282,22 +5343,21 @@ string SrsConfig::get_vhost_http_mount(string vhost)
string SrsConfig::get_vhost_http_dir(string vhost) string SrsConfig::get_vhost_http_dir(string vhost)
{ {
SrsConfDirective* vconf = get_vhost(vhost); static string DEFAULT = "./objs/nginx/html";
if (!vconf) {
return SRS_CONF_DEFAULT_HTTP_DIR; SrsConfDirective* conf = get_vhost(vhost);
if (!conf) {
return DEFAULT;
} }
SrsConfDirective* conf = vconf->get("http"); conf = conf->get("http_static");
if (!conf) { if (!conf) {
conf = vconf->get("http_static"); return DEFAULT;
if (!conf) {
return SRS_CONF_DEFAULT_HTTP_DIR;
}
} }
conf = conf->get("dir"); conf = conf->get("dir");
if (!conf || conf->arg0().empty()) { if (!conf || conf->arg0().empty()) {
return SRS_CONF_DEFAULT_HTTP_DIR; return DEFAULT;
} }
return conf->arg0(); return conf->arg0();
@ -5650,3 +5710,73 @@ bool srs_stream_caster_is_flv(string caster)
{ {
return caster == SRS_CONF_DEFAULT_STREAM_CASTER_FLV; return caster == SRS_CONF_DEFAULT_STREAM_CASTER_FLV;
} }
int srs_config_transform_vhost(SrsConfDirective* root)
{
int ret = ERROR_SUCCESS;
for (int i = 0; i < root->directives.size(); i++) {
SrsConfDirective* dir = root->directives.at(i);
// SRS2.0, rename global http_stream to http_server.
// SRS1:
// http_stream {}
// SRS2+:
// http_server {}
if (dir->name == "http_stream") {
dir->name = "http_server";
continue;
}
if (!dir->is_vhost()) {
continue;
}
std::vector<SrsConfDirective*>::iterator it;
for (it = dir->directives.begin(); it != dir->directives.end();) {
SrsConfDirective* conf = *it;
// SRS2.0, rename vhost http to http_static
// SRS1:
// vhost { http {} }
// SRS2+:
// vhost { http_static {} }
if (conf->name == "http") {
conf->name = "http_static";
++it;
continue;
}
// SRS3.0, change the refer style
// SRS1/2:
// vhost { refer; refer_play; refer_publish; }
// SRS3+:
// vhost { refer { enabled; all; play; publish; } }
if ((conf->name == "refer" && conf->directives.empty()) || conf->name == "refer_play" || conf->name == "refer_publish") {
// remove the old one first, for name duplicated.
it = dir->directives.erase(it);
SrsConfDirective* refer = dir->get_or_create("refer");
refer->get_or_create("enabled", "on");
if (conf->name == "refer") {
SrsConfDirective* all = refer->get_or_create("all");
all->args = conf->args;
} else if (conf->name == "play") {
SrsConfDirective* play = refer->get_or_create("play");
play->args = conf->args;
} else if (conf->name == "publish") {
SrsConfDirective* publish = refer->get_or_create("publish");
publish->args = conf->args;
}
// remove the old directive.
srs_freep(conf);
continue;
}
++it;
}
}
return ret;
}

View file

@ -126,6 +126,10 @@ public:
* get the directive by name and its arg0, return the first match. * get the directive by name and its arg0, return the first match.
*/ */
virtual SrsConfDirective* get(std::string _name, std::string _arg0); virtual SrsConfDirective* get(std::string _name, std::string _arg0);
// raw
public:
virtual SrsConfDirective* get_or_create(std::string n);
virtual SrsConfDirective* get_or_create(std::string n, std::string a0);
// help utilities // help utilities
public: public:
/** /**
@ -293,6 +297,7 @@ private:
/** /**
* reload the http_stream section of config. * reload the http_stream section of config.
*/ */
// TODO: FIXME: rename to http_server.
virtual int reload_http_stream(SrsConfDirective* old_root); virtual int reload_http_stream(SrsConfDirective* old_root);
/** /**
* reload the transcode section of vhost of config. * reload the transcode section of vhost of config.
@ -518,22 +523,24 @@ public:
*/ */
virtual double get_queue_length(std::string vhost); virtual double get_queue_length(std::string vhost);
/** /**
* get the refer antisuck directive. * whether the refer hotlink-denial enabled.
* each args of directive is a refer config. */
* when the client refer(pageUrl) not match the refer config, virtual bool get_refer_enabled(std::string vhost);
* SRS will reject the connection. /**
* @remark, default NULL. * get the refer hotlink-denial for all type.
*/ * @return the refer, NULL for not configed.
*/
// TODO: FIXME: rename to get_refer_all
virtual SrsConfDirective* get_refer(std::string vhost); virtual SrsConfDirective* get_refer(std::string vhost);
/** /**
* get the play refer, refer for play clients. * get the refer hotlink-denial for play.
* @remark, default NULL. * @return the refer, NULL for not configed.
*/ */
virtual SrsConfDirective* get_refer_play(std::string vhost); virtual SrsConfDirective* get_refer_play(std::string vhost);
/** /**
* get the publish refer, refer for publish clients. * get the refer hotlink-denial for publish.
* @remark, default NULL. * @return the refer, NULL for not configed.
*/ */
virtual SrsConfDirective* get_refer_publish(std::string vhost); virtual SrsConfDirective* get_refer_publish(std::string vhost);
/** /**
* get the chunk size of vhost. * get the chunk size of vhost.
@ -1047,10 +1054,6 @@ public:
virtual int get_dvr_time_jitter(std::string vhost); virtual int get_dvr_time_jitter(std::string vhost);
// http api section // http api section
private: private:
/**
* get the http api directive.
*/
virtual SrsConfDirective* get_http_api();
/** /**
* whether http api enabled * whether http api enabled
*/ */
@ -1082,10 +1085,6 @@ public:
virtual bool get_raw_api_allow_query(); virtual bool get_raw_api_allow_query();
// http stream section // http stream section
private: private:
/**
* get the http stream directive.
*/
virtual SrsConfDirective* get_http_stream();
/** /**
* whether http stream enabled. * whether http stream enabled.
*/ */
@ -1094,6 +1093,7 @@ public:
/** /**
* whether http stream enabled. * whether http stream enabled.
*/ */
// TODO: FIXME: rename to http_static.
virtual bool get_http_stream_enabled(); virtual bool get_http_stream_enabled();
/** /**
* get the http stream listen port. * get the http stream listen port.
@ -1238,6 +1238,20 @@ extern bool srs_stream_caster_is_udp(std::string caster);
extern bool srs_stream_caster_is_rtsp(std::string caster); extern bool srs_stream_caster_is_rtsp(std::string caster);
extern bool srs_stream_caster_is_flv(std::string caster); extern bool srs_stream_caster_is_flv(std::string caster);
/**
* parse loaded vhost directives to compatible mode.
* for exmaple, SRS1/2 use the follow refer style:
* refer a.domain.com b.domain.com;
* while SRS3 use the following:
* refer {
* enabled on;
* all a.domain.com b.domain.com;
* }
* so we must transform the vhost directive anytime load the config.
* @param root the root directive to transform, in and out parameter.
*/
extern int srs_config_transform_vhost(SrsConfDirective* root);
// global config // global config
extern SrsConfig* _srs_config; extern SrsConfig* _srs_config;

View file

@ -579,11 +579,13 @@ int SrsRtmpConn::check_vhost()
req->vhost = vhost->arg0(); req->vhost = vhost->arg0();
} }
if ((ret = refer->check(req->pageUrl, _srs_config->get_refer(req->vhost))) != ERROR_SUCCESS) { if (_srs_config->get_refer_enabled(req->vhost)) {
srs_error("check refer failed. ret=%d", ret); if ((ret = refer->check(req->pageUrl, _srs_config->get_refer(req->vhost))) != ERROR_SUCCESS) {
return ret; srs_error("check refer failed. ret=%d", ret);
return ret;
}
srs_verbose("check refer success.");
} }
srs_verbose("check refer success.");
if ((ret = http_hooks_on_connect()) != ERROR_SUCCESS) { if ((ret = http_hooks_on_connect()) != ERROR_SUCCESS) {
return ret; return ret;
@ -637,11 +639,13 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe
srs_assert(consumer != NULL); srs_assert(consumer != NULL);
if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_play(req->vhost))) != ERROR_SUCCESS) { if (_srs_config->get_refer_enabled(req->vhost)) {
srs_error("check play_refer failed. ret=%d", ret); if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_play(req->vhost))) != ERROR_SUCCESS) {
return ret; srs_error("check play_refer failed. ret=%d", ret);
return ret;
}
srs_verbose("check play_refer success.");
} }
srs_verbose("check play_refer success.");
// initialize other components // initialize other components
SrsPithyPrint* pprint = SrsPithyPrint::create_rtmp_play(); SrsPithyPrint* pprint = SrsPithyPrint::create_rtmp_play();
@ -810,12 +814,14 @@ int SrsRtmpConn::do_playing(SrsSource* source, SrsConsumer* consumer, SrsQueueRe
int SrsRtmpConn::publishing(SrsSource* source) int SrsRtmpConn::publishing(SrsSource* source)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;
if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_publish(req->vhost))) != ERROR_SUCCESS) { if (_srs_config->get_refer_enabled(req->vhost)) {
srs_error("check publish_refer failed. ret=%d", ret); if ((ret = refer->check(req->pageUrl, _srs_config->get_refer_publish(req->vhost))) != ERROR_SUCCESS) {
return ret; srs_error("check publish_refer failed. ret=%d", ret);
return ret;
}
srs_verbose("check publish_refer success.");
} }
srs_verbose("check publish_refer success.");
if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) { if ((ret = http_hooks_on_publish()) != ERROR_SUCCESS) {
srs_error("http hook on_publish failed. ret=%d", ret); srs_error("http hook on_publish failed. ret=%d", ret);