winlin

for #277, support http vhost mount.

... ... @@ -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
... ...
... ... @@ -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;
}
}
... ...
... ... @@ -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()
... ...
... ... @@ -266,6 +266,8 @@ class SrsGoHttpServeMux
{
private:
std::map<std::string, SrsGoHttpMuxEntry*> entries;
// whether any patterns contain hostnames
bool hosts;
public:
SrsGoHttpServeMux();
virtual ~SrsGoHttpServeMux();
... ...
... ... @@ -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;
... ...