server.js 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 path = require("path");
  9. var url = require("url");
  10. var fs = require("fs");
  11. var routes = {
  12. index: require("./routes/index"),
  13. avatars: require("./routes/avatars"),
  14. skins: require("./routes/skins"),
  15. renders: require("./routes/renders")
  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 = path.resolve(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. default:
  60. asset_request(request, res);
  61. }
  62. } catch(e) {
  63. var error = JSON.stringify(req.headers) + "\n" + e.stack;
  64. logging.error("Error: " + error);
  65. res.writeHead(500, {
  66. "Content-Type": "text/plain"
  67. });
  68. res.end(config.debug_enabled ? error : "Internal Server Error");
  69. }
  70. } else {
  71. res.writeHead(405, {
  72. "Content-Type": "text/plain"
  73. });
  74. res.end("Method Not Allowed");
  75. }
  76. }
  77. var boot = module.exports = function () {
  78. http.createServer(requestHandler).listen(process.env.PORT || 3000);
  79. };
  80. if (require.main === module) {
  81. boot();
  82. // cleaning worker
  83. setInterval(clean.run, config.cleaning_interval * 1000);
  84. }