exports.middleware = function vhoster( sites ) {
var def,
explicit_default_set = false;
for ( var i in sites ) {
if (typeof sites[ i ] == "function")
sites[ i ] = { app: sites[ i ] }
if ( !def ) {
def = i;
if ( sites[ i ].default ) explicit_default_set = true;
}
else if ( sites[ i ].default ) {
if ( explicit_default_set )
throw new Error("Explicit default already set to " + def);
def = i;
explicit_default_set = true;
}
if ( "scriptName" in sites ) {
sites.scriptName = sites.scriptName.replace( /\/$/, '' );
}
}
var res_404 = {
status: 404,
headers: { "content-type": "text/html" },
body: [ "<h1>404 Not Found</h1>" ]
}
return function( req ) {
var conf,
host = "host" in req.headers
? req.headers.host.replace( /:\d+$/, '')
: req.host;
if ( host in sites )
conf = sites[ host ]
else if ( def ) {
conf = sites[ def ];
host = def;
}
else
return res_404;
if ( conf.scriptName ) {
var path = req.scriptName + req.pathInfo;
if ( path.indexOf(conf.scriptName + "/") != 0 && path != conf.scriptName )
return res_404;
req.scriptName = conf.scriptName;
req.pathInfo = path.substr( conf.scriptName.length );
}
return conf.app( req );
}
}