server.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. #!/usr/bin/env node
  2. var logging = require("./modules/logging");
  3. var querystring = require("querystring");
  4. var config = require("./modules/config");
  5. var clean = require("./modules/cleaner");
  6. var http = require("http");
  7. var mime = require("mime");
  8. var url = require("url");
  9. var fs = require("fs");
  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. var local_path = request.url.path_list[1];
  43. logging.log(request.method + " " + request.url.href);
  44. if (request.method == "GET" || request.method == "HEAD") {
  45. try {
  46. switch (local_path) {
  47. case "":
  48. routes.index(request, res);
  49. break;
  50. case "avatars":
  51. routes.avatars(request, res);
  52. break;
  53. case "skins":
  54. routes.skins(request, res);
  55. break;
  56. case "renders":
  57. routes.renders(request, res);
  58. break;
  59. case "capes":
  60. routes.capes(request, res);
  61. break;
  62. default:
  63. asset_request(request, res);
  64. }
  65. } catch(e) {
  66. var error = JSON.stringify(req.headers) + "\n" + e.stack;
  67. logging.error("Error: " + error);
  68. res.writeHead(500, {
  69. "Content-Type": "text/plain"
  70. });
  71. res.end(config.debug_enabled ? error : "Internal Server Error");
  72. }
  73. } else {
  74. res.writeHead(405, {
  75. "Content-Type": "text/plain"
  76. });
  77. res.end("Method Not Allowed");
  78. }
  79. }
  80. var boot = module.exports = function () {
  81. http.createServer(requestHandler).listen(process.env.PORT || 3000);
  82. };
  83. if (require.main === module) {
  84. boot();
  85. // cleaning worker
  86. setInterval(clean.run, config.cleaning_interval * 1000);
  87. }