skins.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. var networking = require("../modules/networking");
  2. var logging = require("../modules/logging");
  3. var helpers = require("../modules/helpers");
  4. var config = require("../modules/config");
  5. var router = require("express").Router();
  6. var skins = require("../modules/skins");
  7. var lwip = require("lwip");
  8. /* GET skin request. */
  9. router.get("/:uuid.:ext?", function(req, res) {
  10. var uuid = req.params.uuid;
  11. var def = req.query.default;
  12. var start = new Date();
  13. var etag = null;
  14. if (!helpers.uuid_valid(uuid)) {
  15. res.status(422).send("422 Invalid UUID");
  16. return;
  17. }
  18. // strip dashes, to lower case
  19. uuid = uuid.replace(/-/g, "").toLowerCase();
  20. try {
  21. helpers.get_skin(uuid, function(err, hash, image) {
  22. logging.log(uuid);
  23. if (err) {
  24. logging.error(err);
  25. }
  26. etag = hash && hash.substr(0, 32) || "none";
  27. var matches = req.get("If-None-Match") == "\"" + etag + "\"";
  28. if (image) {
  29. var http_status = 200;
  30. if (matches) {
  31. http_status = 304;
  32. } else if (err) {
  33. http_status = 503;
  34. }
  35. logging.debug("Etag: " + req.get("If-None-Match"));
  36. logging.debug("matches: " + matches);
  37. logging.log("status: " + http_status);
  38. sendimage(http_status, image);
  39. } else {
  40. handle_default(404);
  41. }
  42. });
  43. } catch(e) {
  44. logging.error("Error!");
  45. logging.error(e);
  46. handle_default(500);
  47. }
  48. function handle_default(http_status) {
  49. if (def && def != "steve" && def != "alex") {
  50. res.writeHead(301, {
  51. "Cache-Control": "max-age=" + config.browser_cache_time + ", public",
  52. "Response-Time": new Date() - start,
  53. "X-Storage-Type": "downloaded",
  54. "Access-Control-Allow-Origin": "*",
  55. "Location": def
  56. });
  57. res.end();
  58. } else {
  59. def = def || skins.default_skin(uuid);
  60. lwip.open("public/images/" + def + "_skin.png", function(err, image) {
  61. image.toBuffer("png", function(err, buffer) {
  62. sendimage(http_status, buffer);
  63. });
  64. });
  65. }
  66. }
  67. function sendimage(http_status, image) {
  68. res.writeHead(http_status, {
  69. "Content-Type": "image/png",
  70. "Cache-Control": "max-age=" + config.browser_cache_time + ", public",
  71. "Response-Time": new Date() - start,
  72. "X-Storage-Type": "downloaded",
  73. "Access-Control-Allow-Origin": "*",
  74. "Etag": "\"" + etag + "\""
  75. });
  76. res.end(http_status == 304 ? null : image);
  77. }
  78. });
  79. module.exports = router;