server.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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. fs.readFile(filename, function(err, file_buffer) {
  22. if (err) {
  23. res.writeHead(500, {"Content-type" : "text/plain"});
  24. res.end("Internal Server Error");
  25. } else {
  26. res.writeHead(200, {
  27. "Content-type" : mime.lookup(filename),
  28. "Content-Length": file_buffer.length
  29. });
  30. res.end(file_buffer);
  31. }
  32. });
  33. } else {
  34. res.writeHead(404, {
  35. "Content-type" : "text/plain"
  36. });
  37. res.end("Not Found");
  38. }
  39. });
  40. }
  41. function requestHandler(req, res) {
  42. var request = req;
  43. request.url = url.parse(req.url, true);
  44. request.url.query = request.url.query || {};
  45. // remove trailing and double slashes + other junk
  46. var path_list = path.resolve(request.url.pathname).split("/");
  47. for (var i = 0; i < path_list.length; i++) {
  48. // URL decode
  49. path_list[i] = querystring.unescape(path_list[i]);
  50. }
  51. request.url.path_list = path_list;
  52. var local_path = request.url.path_list[1];
  53. console.log(request.method + " " + request.url.href);
  54. if (request.method == "GET" || request.method == "HEAD") {
  55. try {
  56. switch (local_path) {
  57. case "":
  58. routes.index(request, res);
  59. break;
  60. case "avatars":
  61. routes.avatars(request, res);
  62. break;
  63. case "skins":
  64. routes.skins(request, res);
  65. break;
  66. case "renders":
  67. routes.renders(request, res);
  68. break;
  69. default:
  70. asset_request(request, res);
  71. }
  72. } catch(e) {
  73. var error = JSON.stringify(req.headers) + "\n" + e.stack;
  74. logging.error("Error: " + error);
  75. res.writeHead(500, {
  76. "Content-Type": "text/plain"
  77. });
  78. res.end(config.debug_enabled ? error : "Internal Server Error");
  79. }
  80. } else {
  81. res.writeHead(405, {
  82. "Content-Type": "text/plain"
  83. });
  84. res.end("Method Not Allowed");
  85. }
  86. }
  87. http.createServer(requestHandler).listen(process.env.PORT || 3000);
  88. // cleaning worker
  89. setInterval(clean.run, config.cleaning_interval * 1000);