server.js 2.6 KB

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