diff --git a/authority/server/run.js b/authority/server/run.js index 9117e02873697d01fc98eedabb290c575f2050ac..9b214a9737144603e812cfe75cad1b7085f0684a 100644 --- a/authority/server/run.js +++ b/authority/server/run.js @@ -10,7 +10,7 @@ exports.handler = function(request, response, serveFile) { var urlpath = url.parse(request.url).pathname; if (urlpath === '/sign_in') { - serveFile(path.join(STATIC_DIR, "dialog", "index.html")); + serveFile(path.join(STATIC_DIR, "dialog", "index.html"), response); } else if (/^\/wsapi\/\w+$/.test(urlpath)) { try { var method = path.basename(urlpath); @@ -22,6 +22,6 @@ exports.handler = function(request, response, serveFile) { } } else { // node.js takes care of sanitizing the request path - serveFile(path.join(STATIC_DIR, urlpath)); + serveFile(path.join(STATIC_DIR, urlpath), response); } }; diff --git a/run.js b/run.js index fac8dc7b7d13b1f035344296497646ece179fb8b..f23001ba91014744241308cdc21af3e6e592329d 100644 --- a/run.js +++ b/run.js @@ -1,10 +1,11 @@ // a little node webserver designed to run the unit tests herein -var sys = require("sys"), -http = require("http"), -url = require("url"), -path = require("path"), -fs = require("fs"); +var sys = require("sys"), + http = require("http"), + url = require("url"), + path = require("path"), + fs = require("fs"), + connect = require("connect"); var PRIMARY_HOST = "127.0.0.1"; @@ -31,118 +32,78 @@ function getServerByName(name) { return undefined; } -function fourOhFour(resp, reason) { - resp.writeHead(404, {"Content-Type": "text/plain"}); - resp.write("404 Not Found"); - if (reason) { - resp.write(": " + reason); - } - resp.end(); - return undefined; -} - -function createServer(port) { - var myserver = http.createServer(function(request, response) { - var hostname = request.headers['host'].toString("utf8"); - var port = parseInt(hostname.split(':')[1]); - var host = hostname.split(':')[0]; - - // normalize 'localhost', so it just works. - if (host === 'localhost') { - var redirectURL = "http://127.0.0.1:" + port + request.url; - response.writeHead(302, {"Location": redirectURL}); +function serveFile(filename, response) { + path.exists(filename, function(exists) { + if(!exists) { + response.writeHead(404, {"Content-Type": "text/plain"}); + response.write("404 Not Found"); response.end(); return; } - // get the directory associated with the port hit by client - var site = getSiteRef(host, port); - - // unknown site? really? - if (!site.root) return fourOhFour(response, "No site on this port"); - - var serveFile = function (filename) { - path.exists(filename, function(exists) { - if(!exists) { - response.writeHead(404, {"Content-Type": "text/plain"}); - response.write("404 Not Found"); - response.end(); - sys.puts("404 " + filename); - return; - } - - fs.readFile(filename, "binary", function(err, data) { - if(err) { - response.writeHead(500, {"Content-Type": "text/plain"}); - response.write(err + "\n"); - response.end(); - sys.puts("500 " + filename); - return; - } - - var exts = { - ".js": "text/javascript", - ".css": "text/css", - ".html": "text/html", - ".webapp": "application/x-web-app-manifest+json", - ".png": "image/png", - ".ico": "image/x-icon" - }; - - var ext = path.extname(filename); - var mimeType = exts[ext] || "application/octet-stream"; - - for (var i = 0; i < boundServers.length; i++) { - var o = boundServers[i] - var a = o.server.address(); - var from = o.name + ".mozilla.org"; - var to = a.address + ":" + a.port; - data = data.replace(from, to); - } - - response.writeHead(200, {"Content-Type": mimeType}); - response.write(data, "binary"); - response.end(); - sys.puts("200 " + filename); - }); - }); - }; + fs.readFile(filename, "binary", function(err, data) { + if(err) { + response.writeHead(500, {"Content-Type": "text/plain"}); + response.write(err + "\n"); + response.end(); + return; + } + var exts = { + ".js": "text/javascript", + ".css": "text/css", + ".html": "text/html", + ".webapp": "application/x-web-app-manifest+json", + ".png": "image/png", + ".ico": "image/x-icon" + }; - function serveFileIndex(filename) { - // automatically serve index.html if this is a directory - fs.stat(filename, function(err, s) { - if (err === null && s.isDirectory()) { - serveFile(path.join(filename, "index.html")); - } else { - serveFile(filename); - } - }); - } + var ext = path.extname(filename); + var mimeType = exts[ext] || "application/octet-stream"; - // if this site has a handler, we'll run that, otherwise serve statically - if (site.handler) { - site.handler(request, response, serveFile); - } else { - 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); + for (var i = 0; i < boundServers.length; i++) { + var o = boundServers[i] + var a = o.server.address(); + var from = o.name + ".mozilla.org"; + var to = a.address + ":" + a.port; + data = data.replace(from, to); } + + response.writeHead(200, {"Content-Type": mimeType}); + response.write(data, "binary"); + response.end(); + }); + }); +} + +function serveFileIndex(filename, response) { + // automatically serve index.html if this is a directory + fs.stat(filename, function(err, s) { + if (err === null && s.isDirectory()) { + serveFile(path.join(filename, "index.html"), response); + } else { + serveFile(filename, response); } }); - myserver.listen(port, PRIMARY_HOST); - return myserver; +} + +function createServer(obj) { + var server = connect.createServer().use(connect.favicon()) + .use(connect.logger({format: ":status :method :remote-addr :response-time :url"})); + + // if this site has a handler, we'll run that, otherwise serve statically + if (obj.handler) { + server.use(function(req, resp, next) { + obj.handler(req, resp, serveFile); + }); + } else { + server.use(function(req, resp, next) { + var filename = path.join(obj.path, url.parse(req.url).pathname); + serveFileIndex(filename, resp); + }); + } + server.listen(obj.port, PRIMARY_HOST); + return server; }; // start up webservers on ephemeral ports for each subdirectory here. @@ -153,11 +114,8 @@ var dirs = [ "authority", "rp" ].map(function(d) { }; }); -function formatLink(nameOrServer, extraPath) { - if (typeof nameOrServer == 'string') { - nameOrServer = getServerByName(nameOrServer).server; - } - var addr = nameOrServer.address(); +function formatLink(server, extraPath) { + var addr = server.address(); var url = 'http://' + addr.address + ':' + addr.port; if (extraPath) { url += extraPath; @@ -177,11 +135,14 @@ dirs.forEach(function(dirObj) { } catch(e) { } - boundServers.push({ + var so = { path: dirObj.path, - server: createServer(0), + server: undefined, + port: "0", name: dirObj.name, handler: handler - }); - console.log(" " + dirObj.name + ": " + formatLink(dirObj.name)); + }; + so.server = createServer(so) + boundServers.push(so); + console.log(" " + dirObj.name + ": " + formatLink(so.server)); });