server.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #!/usr/bin/env node
  2. var logging = require("./modules/logging");
  3. var querystring = require("querystring");
  4. var config = require("./modules/config");
  5. var http = require("http");
  6. var mime = require("mime");
  7. var url = require("url");
  8. var fs = require("fs");
  9. var server = null;
  10. var routes = {
  11. index: require("./routes/index"),
  12. avatars: require("./routes/avatars"),
  13. skins: require("./routes/skins"),
  14. renders: require("./routes/renders"),
  15. capes: require("./routes/capes")
  16. };
  17. function asset_request(req, res) {
  18. var filename = __dirname + "/public/" + req.url.path_list.join("/");
  19. fs.exists(filename, function(exists) {
  20. if (exists) {
  21. res.writeHead(200, { "Content-type" : mime.lookup(filename) });
  22. fs.createReadStream(filename).pipe(res);
  23. } else {
  24. res.writeHead(404, {
  25. "Content-type" : "text/plain"
  26. });
  27. res.end("Not Found");
  28. }
  29. });
  30. }
  31. function requestHandler(req, res) {
  32. var request = req;
  33. request.url = url.parse(req.url, true);
  34. request.url.query = request.url.query || {};
  35. // remove trailing and double slashes + other junk
  36. var path_list = request.url.pathname.split("/");
  37. for (var i = 0; i < path_list.length; i++) {
  38. // URL decode
  39. path_list[i] = querystring.unescape(path_list[i]);
  40. }
  41. request.url.path_list = path_list;
  42. // generate 12 character random string
  43. request.id = Math.random().toString(36).substring(2,14) + " ";
  44. var local_path = request.url.path_list[1];
  45. logging.log(request.id + request.method + " " + request.url.href);
  46. if (request.method === "GET" || request.method === "HEAD") {
  47. try {
  48. switch (local_path) {
  49. case "":
  50. routes.index(request, res);
  51. break;
  52. case "avatars":
  53. routes.avatars(request, res);
  54. break;
  55. case "skins":
  56. routes.skins(request, res);
  57. break;
  58. case "renders":
  59. routes.renders(request, res);
  60. break;
  61. case "capes":
  62. routes.capes(request, res);
  63. break;
  64. default:
  65. asset_request(request, res);
  66. }
  67. } catch(e) {
  68. var error = JSON.stringify(req.headers) + "\n" + e.stack;
  69. logging.error(request.id + "Error: " + error);
  70. res.writeHead(500, {
  71. "Content-Type": "text/plain"
  72. });
  73. res.end(config.debug_enabled ? error : "Internal Server Error");
  74. }
  75. } else {
  76. res.writeHead(405, {
  77. "Content-Type": "text/plain"
  78. });
  79. res.end("Method Not Allowed");
  80. }
  81. }
  82. var exp = {};
  83. exp.boot = function(callback) {
  84. var port = process.env.PORT || 3000;
  85. var bind_ip = process.env.BIND || "0.0.0.0";
  86. logging.log("Server running on http://" + bind_ip + ":" + port + "/");
  87. server = http.createServer(requestHandler).listen(port, bind_ip, function() {
  88. if (callback) {
  89. callback();
  90. }
  91. });
  92. };
  93. exp.close = function(callback) {
  94. server.close(function() {
  95. callback();
  96. });
  97. };
  98. module.exports = exp;
  99. if (require.main === module) {
  100. logging.error("Please use 'npm start' or 'bin/www.js'");
  101. process.exit(1);
  102. }