diff --git a/run.js b/run.js index ba98309048936a26e8ad6bc1fb2f9b8b21af7516..fac8dc7b7d13b1f035344296497646ece179fb8b 100644 --- a/run.js +++ b/run.js @@ -10,12 +10,15 @@ var PRIMARY_HOST = "127.0.0.1"; // all bound webservers stored in this lil' object var boundServers = [ ]; -function getWebRootDir(host, port) { +function getSiteRef(host, port) { for (var i = 0; i < boundServers.length; i++) { var o = boundServers[i]; var a = o.server.address(); if (host === a.address && port === a.port) { - return o.path ? o.path : __dirname; + return { + root: o.path ? o.path : __dirname, + handler: o.handler + }; } } return undefined; @@ -53,10 +56,10 @@ function createServer(port) { } // get the directory associated with the port hit by client - var siteroot = getWebRootDir(host, port); + var site = getSiteRef(host, port); // unknown site? really? - if (!siteroot) return fourOhFour(response, "No site on this port"); + if (!site.root) return fourOhFour(response, "No site on this port"); var serveFile = function (filename) { path.exists(filename, function(exists) { @@ -94,7 +97,6 @@ function createServer(port) { var a = o.server.address(); var from = o.name + ".mozilla.org"; var to = a.address + ":" + a.port; - console.log("replace: " + from + " with " + to); data = data.replace(from, to); } @@ -118,20 +120,25 @@ function createServer(port) { }); } - var filename = path.join(siteroot, url.parse(request.url).pathname); - - if (siteroot == __dirname) { - // We're layering two directories in this case - var otherPath = path.join(__dirname, '..', url.parse(request.url).pathname); - path.exists(otherPath, function(exists) { - if (exists) { - serveFileIndex(otherPath); - } else { - serveFileIndex(filename); - } - }); + // if this site has a handler, we'll run that, otherwise serve statically + if (site.handler) { + site.handler(request, response, serveFile); } else { - serveFileIndex(filename); + var filename = path.join(site.root, url.parse(request.url).pathname); + + if (site.root == __dirname) { + // We're layering two directories in this case + var otherPath = path.join(__dirname, '..', url.parse(request.url).pathname); + path.exists(otherPath, function(exists) { + if (exists) { + serveFileIndex(otherPath); + } else { + serveFileIndex(filename); + } + }); + } else { + serveFileIndex(filename); + } } }); myserver.listen(port, PRIMARY_HOST); @@ -161,10 +168,20 @@ function formatLink(nameOrServer, extraPath) { console.log("Running test servers:"); dirs.forEach(function(dirObj) { if (!fs.statSync(dirObj.path).isDirectory()) return; + // does this server have a js handler for custom request handling? + var handlerPath = path.join(dirObj.path, "server", "run.js"); + var handler = undefined; + try { + fs.statSync(handlerPath).isFile(); + handler = require(handlerPath).handler; + } catch(e) { + } + boundServers.push({ path: dirObj.path, server: createServer(0), - name: dirObj.name + name: dirObj.name, + handler: handler }); console.log(" " + dirObj.name + ": " + formatLink(dirObj.name)); });