You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

server.js 2.4KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. var app = require('http').createServer(handler)
  2. , sockets = require('./sockets.js')
  3. , fs = require('fs')
  4. , path = require('path')
  5. , nodestatic = require("node-static");
  6. var io = sockets.start(app);
  7. /**
  8. * Folder from which static files will be served
  9. * @const
  10. * @type {string}
  11. */
  12. var WEBROOT = path.join(__dirname, "../client-data");
  13. /**
  14. * Port on which the application will listen
  15. * @const
  16. * @type {number}
  17. */
  18. var PORT = parseInt(process.env['PORT']) || 8080;
  19. app.listen(PORT);
  20. console.log("Server listening on "+PORT);
  21. var fileserver = new nodestatic.Server(WEBROOT,
  22. {
  23. "headers" : {"X-UA-Compatible": "IE=Edge"}
  24. });
  25. function serveError(request, response, err) {
  26. console.warn("Error serving '"+request.url+"' : "+err.status+" "+err.message);
  27. fileserver.serveFile('error.html', err.status, {}, request, response);
  28. }
  29. function logRequest (request) {
  30. var ip = request.headers['X-Forwarded-For'] || request.connection.remoteAddress;
  31. console.log("Connection from " + ip +
  32. " ("+request.headers['user-agent']+") to "+request.url);
  33. }
  34. function handler (request, response) {
  35. var parts = request.url.split('/');
  36. if (parts[0] === '') parts.shift();
  37. if (parts.length === 0) {
  38. fileserver.serveFile("index.html", 200, {}, request, response);
  39. } else if (parts[0] === "boards") {
  40. // "boards" refers to the root directory
  41. // If there is no dot and no directory, parts[1] is the board name
  42. if (parts.length === 2 && request.url.indexOf('.') === -1) {
  43. fileserver.serveFile("board.html", 200, {}, request, response);
  44. logRequest(request);
  45. } else { // Else, it's a resource
  46. request.url = "/" + parts.slice(1).join('/');
  47. fileserver.serve(request, response, function (err, res){
  48. if (err) serveError(request, response, err);
  49. });
  50. }
  51. } else if (parts[0] === "download") {
  52. var boardName = encodeURIComponent(parts[1]),
  53. history_file = "../server-data/board-" + boardName + ".json",
  54. headers = {
  55. "Content-Type": "application/json",
  56. "Content-Disposition": 'attachment; filename="'+boardName+'.wbo"'
  57. };
  58. var promise = fileserver.serveFile(history_file, 200, headers, request, response);
  59. promise.on("error", function(err){
  60. console.error("Error while downloading history", err);
  61. response.statusCode = 404;
  62. response.end("ERROR: Unable to serve history file\n");
  63. });
  64. } else {
  65. fileserver.serve(request, response, function (err, res){
  66. if (err) serveError(request, response, err);
  67. });
  68. }
  69. }