server.js 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 query = url.parse(req.url).query;
  43. var request = req;
  44. // we need to use url.parse and give the result to url.parse because nodejs
  45. request.url = url.parse(req.url, query);
  46. request.url.query = request.url.query || {};
  47. // remove trailing and double slashes + other junk
  48. var path_list = path.resolve(request.url.pathname).split("/");
  49. for (var i = 0; i < path_list.length; i++) {
  50. // URL decode
  51. path_list[i] = querystring.unescape(path_list[i]);
  52. }
  53. request.url.path_list = path_list;
  54. var local_path = request.url.path_list[1];
  55. console.log(request.method + " " + request.url.href);
  56. if (request.method == "GET" || request.method == "HEAD") {
  57. try {
  58. switch (local_path) {
  59. case "":
  60. routes.index(request, res);
  61. break;
  62. case "avatars":
  63. routes.avatars(request, res);
  64. break;
  65. case "skins":
  66. routes.skins(request, res);
  67. break;
  68. case "renders":
  69. routes.renders(request, res);
  70. break;
  71. default:
  72. asset_request(request, res);
  73. }
  74. } catch(e) {
  75. var error = JSON.stringify(req.headers) + "\n" + e.stack;
  76. logging.error("Error: " + error);
  77. res.writeHead(500, {
  78. "Content-Type": "text/plain"
  79. });
  80. res.end(config.debug_enabled ? error : "Internal Server Error");
  81. }
  82. } else {
  83. res.writeHead(405, {
  84. "Content-Type": "text/plain"
  85. });
  86. res.end("Method Not Allowed");
  87. }
  88. }
  89. http.createServer(requestHandler).listen(process.env.PORT || 3000);
  90. // cleaning worker
  91. setInterval(clean.run, config.cleaning_interval * 1000);