123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #!/usr/bin/env node
- var logging = require("./modules/logging");
- var querystring = require("querystring");
- var config = require("./modules/config");
- var http = require("http");
- var mime = require("mime");
- var url = require("url");
- var fs = require("fs");
- var server = null;
- var routes = {
- index: require("./routes/index"),
- avatars: require("./routes/avatars"),
- skins: require("./routes/skins"),
- renders: require("./routes/renders"),
- capes: require("./routes/capes")
- };
- function asset_request(req, res) {
- var filename = __dirname + "/public/" + req.url.path_list.join("/");
- fs.exists(filename, function(exists) {
- if (exists) {
- res.writeHead(200, { "Content-type" : mime.lookup(filename) });
- fs.createReadStream(filename).pipe(res);
- } else {
- res.writeHead(404, {
- "Content-type" : "text/plain"
- });
- res.end("Not Found");
- }
- });
- }
- function requestHandler(req, res) {
- var request = req;
- request.url = url.parse(req.url, true);
- request.url.query = request.url.query || {};
- // remove trailing and double slashes + other junk
- var path_list = request.url.pathname.split("/");
- for (var i = 0; i < path_list.length; i++) {
- // URL decode
- path_list[i] = querystring.unescape(path_list[i]);
- }
- request.url.path_list = path_list;
- // generate 12 character random string
- request.id = Math.random().toString(36).substring(2,14) + " ";
- var local_path = request.url.path_list[1];
- logging.log(request.id + request.method + " " + request.url.href);
- if (request.method === "GET" || request.method === "HEAD") {
- try {
- switch (local_path) {
- case "":
- routes.index(request, res);
- break;
- case "avatars":
- routes.avatars(request, res);
- break;
- case "skins":
- routes.skins(request, res);
- break;
- case "renders":
- routes.renders(request, res);
- break;
- case "capes":
- routes.capes(request, res);
- break;
- default:
- asset_request(request, res);
- }
- } catch(e) {
- var error = JSON.stringify(req.headers) + "\n" + e.stack;
- logging.error(request.id + "Error: " + error);
- res.writeHead(500, {
- "Content-Type": "text/plain"
- });
- res.end(config.debug_enabled ? error : "Internal Server Error");
- }
- } else {
- res.writeHead(405, {
- "Content-Type": "text/plain"
- });
- res.end("Method Not Allowed");
- }
- }
- var exp = {};
- exp.boot = function(callback) {
- var port = process.env.PORT || 3000;
- var bind_ip = process.env.BIND || "0.0.0.0";
- logging.log("Server running on http://" + bind_ip + ":" + port + "/");
- server = http.createServer(requestHandler).listen(port, bind_ip, function() {
- if (callback) {
- callback();
- }
- });
- };
- exp.close = function(callback) {
- server.close(function() {
- callback();
- });
- };
- module.exports = exp;
- if (require.main === module) {
- logging.error("Please use 'npm start' or 'bin/www.js'");
- process.exit(1);
- }
|