Browse Source

use new response module for skins

jomo 10 years ago
parent
commit
a947b02c87
4 changed files with 58 additions and 73 deletions
  1. 8 6
      lib/response.js
  2. 7 6
      lib/routes/avatars.js
  3. 40 60
      lib/routes/skins.js
  4. 3 1
      lib/server.js

+ 8 - 6
lib/response.js

@@ -16,7 +16,7 @@ var human_status = {
 // +request+ a http.IncomingMessage
 // +response+ a http.ServerResponse
 // +result+ an object with:
-//  * status:   see human_status, required for images
+//  * status:   see human_status, required for images without err
 //  * redirect: redirect URL
 //  * body:     file or message, required unless redirect is present or status is < 0
 //  * type:     a valid Content-Type for the body, defaults to "text/plain"
@@ -38,19 +38,21 @@ module.exports = function(request, response, result) {
 
   // These headers are the same for every response
   var headers = {
-    "Content-Type": result.type || "text/plain",
+    "Content-Type": (result.body && result.type) || "text/plain",
     "Cache-Control": "max-age=" + config.browser_cache_time + ", public",
     "Response-Time": Date.now() - request.start,
     "X-Request-ID": request.id,
     "Access-Control-Allow-Origin": "*"
   };
 
-  if (result.status) {
-    headers["X-Storage-Type"] = human_status[result.status];
-  }
-
   if (result.err) {
     logging.error(result.err);
+    logging.error(result.err.stack);
+    result.status = -1;
+  }
+
+  if (result.status !== undefined) {
+    headers["X-Storage-Type"] = human_status[result.status];
   }
 
   if (result.body) {

+ 7 - 6
lib/routes/avatars.js

@@ -5,20 +5,21 @@ var skins = require("../skins");
 var cache = require("../cache");
 var path = require("path");
 
-function handle_default(img_status, userId, size, def, callback) {
+function handle_default(img_status, userId, size, def, err, callback) {
   if (def && def !== "steve" && def !== "alex") {
     callback({
       status: img_status,
-      redirect: def
+      redirect: def,
+      err: err
     });
   } else {
     def = def || skins.default_skin(userId);
-    skins.resize_img(path.join(__dirname, "..", "public", "images", def + ".png"), size, function(err, image) {
+    skins.resize_img(path.join(__dirname, "..", "public", "images", def + ".png"), size, function(resize_err, image) {
       callback({
         status: img_status,
         body: image,
         type: "image/png",
-        err: err
+        err: resize_err || err
       });
     });
   }
@@ -70,11 +71,11 @@ module.exports = function(req, callback) {
           hash: hash
         });
       } else {
-        handle_default(status, userId, size, def, callback);
+        handle_default(status, userId, size, def, err, callback);
       }
     });
   } catch(e) {
     logging.error(req.id, "error:", e.stack);
-    handle_default(-1, userId, size, def, callback);
+    handle_default(-1, userId, size, def, e, callback);
   }
 };

+ 40 - 60
lib/routes/skins.js

@@ -1,62 +1,49 @@
 var logging = require("../logging");
 var helpers = require("../helpers");
-var config = require("../config");
 var skins = require("../skins");
 var path = require("path");
 var lwip = require("lwip");
 
-// GET skin request
-module.exports = function(req, res) {
-  var start = new Date();
-  var userId = (req.url.path_list[1] || "").split(".")[0];
-  var def = req.url.query.default;
-  var etag = null;
-  var rid = req.id;
-
-  function sendimage(rid, http_status, image) {
-    logging.log(rid, "status:", http_status);
-    res.writeHead(http_status, {
-      "Content-Type": "image/png",
-      "Cache-Control": "max-age=" + config.browser_cache_time + ", public",
-      "Response-Time": new Date() - start,
-      "X-Storage-Type": "downloaded",
-      "X-Request-ID": rid,
-      "Access-Control-Allow-Origin": "*",
-      "Etag": '"' + etag + '"'
+function handle_default(img_status, userId, def, err, callback) {
+  if (def && def !== "steve" && def !== "alex") {
+    callback({
+      status: img_status,
+      redirect: def,
+      err: err
     });
-    res.end(http_status === 304 ? null : image);
-  }
-
-  function handle_default(rid, http_status, userId) {
-    if (def && def !== "steve" && def !== "alex") {
-      logging.log(rid, "status: 301");
-      res.writeHead(301, {
-        "Cache-Control": "max-age=" + config.browser_cache_time + ", public",
-        "Response-Time": new Date() - start,
-        "X-Storage-Type": "downloaded",
-        "X-Request-ID": rid,
-        "Access-Control-Allow-Origin": "*",
-        "Location": def
-      });
-      res.end();
-    } else {
-      def = def || skins.default_skin(userId);
-      lwip.open(path.join(__dirname, "..", "public", "images", def + "_skin.png"), function(err, image) {
-        // FIXME: err is not handled
+  } else {
+    def = def || skins.default_skin(userId);
+    lwip.open(path.join(__dirname, "..", "public", "images", def + "_skin.png"), function(lwip_err, image) {
+      if (image) {
         image.toBuffer("png", function(buf_err, buffer) {
-          // FIXME: buf_err is not handled
-          sendimage(rid, http_status, buffer);
+          callback({
+            status: img_status,
+            body: buffer,
+            type: "image/png",
+            err: buf_err || lwip_err || err
+          });
+        });
+      } else {
+        callback({
+          status: -1,
+          err: lwip_err || err
         });
-      });
-    }
+      }
+    });
   }
+}
+
+// GET skin request
+module.exports = function(req, callback) {
+  var userId = (req.url.path_list[1] || "").split(".")[0];
+  var def = req.url.query.default;
+  var rid = req.id;
 
   if (!helpers.id_valid(userId)) {
-    res.writeHead(422, {
-      "Content-Type": "text/plain",
-      "Response-Time": new Date() - start
+    callback({
+      status: -2,
+      body: "Invalid userid"
     });
-    res.end("Invalid ID");
     return;
   }
 
@@ -66,25 +53,18 @@ module.exports = function(req, res) {
 
   try {
     helpers.get_skin(rid, userId, function(err, hash, image) {
-      if (err) {
-        logging.error(rid, err);
-      }
-      etag = hash && hash.substr(0, 32) || "none";
-      var matches = req.headers["if-none-match"] === '"' + etag + '"';
       if (image) {
-        var http_status = 200;
-        if (err) {
-          http_status = 503;
-        }
-        logging.debug(rid, "etag:", req.headers["if-none-match"]);
-        logging.debug(rid, "matches:", matches);
-        sendimage(rid, matches ? 304 : http_status, image);
+        callback({
+          body: image,
+          type: "image/png",
+          err: err
+        });
       } else {
-        handle_default(rid, 200, userId);
+        handle_default(2, userId, def, err, callback);
       }
     });
   } catch(e) {
     logging.error(rid, "error:", e.stack);
-    handle_default(rid, 500, userId);
+    handle_default(-1, userId, def, e, callback);
   }
 };

+ 3 - 1
lib/server.js

@@ -80,7 +80,9 @@ function requestHandler(req, res) {
         });
         break;
         case "skins":
-        routes.skins(req, res);
+        routes.skins(req, function(result) {
+          response(req, res, result);
+        });
         break;
         case "renders":
         routes.renders(req, res);