diff --git a/trunk/conf/full.conf b/trunk/conf/full.conf index 3f7e860c9..b6c2e594e 100644 --- a/trunk/conf/full.conf +++ b/trunk/conf/full.conf @@ -336,8 +336,8 @@ vhost ingest.srs.com { # default: off. enabled off; # output stream. variables: - # [vhost] current vhost which start the ingest. - # [port] system RTMP stream port. + # [vhost] current vhost which start the ingest. + # [port] system RTMP stream port. output rtmp://127.0.0.1:[port]/live?vhost=[vhost]/livestream; } } @@ -351,9 +351,12 @@ vhost http.srs.com { # default: off enabled on; # the virtual directory root for this vhost to mount at - # for example, if mount to /hls, user access by http://server/hls - # default: / - mount /hls; + # for example, if mount to [vhost]/hls, user access by http://[vhost]/hls + # the variables: + # [vhost] current vhost for http server. + # @remark the http of __defaultVhost__ will override the http_stream section. + # default: [vhost]/ + mount [vhost]/hls; # main dir of vhost, # to delivery HTTP stream of this vhost. # default: ./objs/nginx/html diff --git a/trunk/conf/http.server.conf b/trunk/conf/http.server.conf index a56d88b00..5e63e373a 100644 --- a/trunk/conf/http.server.conf +++ b/trunk/conf/http.server.conf @@ -8,10 +8,10 @@ http_stream { listen 8080; dir ./objs/nginx/html; } -vhost __defaultVhost__ { +vhost ossrs.net { http { enabled on; - mount /default; + mount [vhost]/; dir ./objs/nginx/html; } } diff --git a/trunk/src/app/srs_app_http.cpp b/trunk/src/app/srs_app_http.cpp index a91c536aa..4c76d3359 100644 --- a/trunk/src/app/srs_app_http.cpp +++ b/trunk/src/app/srs_app_http.cpp @@ -287,8 +287,9 @@ int SrsGoHttpFileServer::serve_http(ISrsGoHttpResponseWriter* w, SrsHttpMessage* string fullpath = dir + "/"; srs_assert(entry); - if (upath.length() > entry->pattern.length()) { - fullpath += upath.substr(entry->pattern.length()); + size_t pos = entry->pattern.find("/"); + if (upath.length() > entry->pattern.length() && pos != string::npos) { + fullpath += upath.substr(entry->pattern.length() - pos); } else { fullpath += upath; } @@ -402,6 +403,7 @@ SrsGoHttpMuxEntry::~SrsGoHttpMuxEntry() SrsGoHttpServeMux::SrsGoHttpServeMux() { + hosts = false; } SrsGoHttpServeMux::~SrsGoHttpServeMux() @@ -442,6 +444,10 @@ int SrsGoHttpServeMux::handle(std::string pattern, ISrsGoHttpHandler* handler) } } + if (pattern.at(0) != '/') { + hosts = true; + } + if (true) { SrsGoHttpMuxEntry* entry = new SrsGoHttpMuxEntry(); entry->explicit_match = true; @@ -538,6 +544,11 @@ int SrsGoHttpServeMux::match(SrsHttpMessage* r, ISrsGoHttpHandler** ph) std::string path = r->path(); + // Host-specific pattern takes precedence over generic ones + if (hosts) { + path = r->host() + path; + } + int nb_matched = 0; ISrsGoHttpHandler* h = NULL; @@ -700,7 +711,8 @@ int SrsHttpMessage::initialize() int ret = ERROR_SUCCESS; // parse uri to schema/server:port/path?query - if ((ret = _uri->initialize(_url)) != ERROR_SUCCESS) { + std::string uri = "http://" + get_request_header("Host") + _url; + if ((ret = _uri->initialize(uri)) != ERROR_SUCCESS) { return ret; } @@ -822,7 +834,7 @@ string SrsHttpMessage::url() string SrsHttpMessage::host() { - return get_request_header("Host"); + return _uri->get_host(); } string SrsHttpMessage::path() diff --git a/trunk/src/app/srs_app_http.hpp b/trunk/src/app/srs_app_http.hpp index 271f7d35e..63b7ba26c 100644 --- a/trunk/src/app/srs_app_http.hpp +++ b/trunk/src/app/srs_app_http.hpp @@ -266,6 +266,8 @@ class SrsGoHttpServeMux { private: std::map entries; + // whether any patterns contain hostnames + bool hosts; public: SrsGoHttpServeMux(); virtual ~SrsGoHttpServeMux(); diff --git a/trunk/src/app/srs_app_http_conn.cpp b/trunk/src/app/srs_app_http_conn.cpp index 7ed8bc7fd..65af7897f 100644 --- a/trunk/src/app/srs_app_http_conn.cpp +++ b/trunk/src/app/srs_app_http_conn.cpp @@ -165,12 +165,16 @@ int SrsHttpServer::initialize() std::string mount = _srs_config->get_vhost_http_mount(vhost); std::string dir = _srs_config->get_vhost_http_dir(vhost); + + // replace the vhost variable + mount = srs_string_replace(mount, "[vhost]", vhost); // the dir mount must always ends with "/" if (mount != "/" && mount.rfind("/") != mount.length() - 1) { mount += "/"; } + // mount the http of vhost. if ((ret = mux.handle(mount, new SrsVodStream(dir))) != ERROR_SUCCESS) { srs_error("http: mount dir=%s for vhost=%s failed. ret=%d", dir.c_str(), vhost.c_str(), ret); return ret;