diff --git a/lib/response.js b/lib/response.js index 0d780ad..08c156c 100644 --- a/lib/response.js +++ b/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) { diff --git a/lib/routes/avatars.js b/lib/routes/avatars.js index b13b6ed..7b4f23d 100644 --- a/lib/routes/avatars.js +++ b/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); } }; \ No newline at end of file diff --git a/lib/routes/skins.js b/lib/routes/skins.js index 6fd2dec..cd1ac9d 100644 --- a/lib/routes/skins.js +++ b/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"); +function handle_default(img_status, userId, def, err, callback) { + if (def && def !== "steve" && def !== "alex") { + callback({ + status: img_status, + redirect: def, + err: err + }); + } 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) { + 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, res) { - var start = new Date(); +module.exports = function(req, callback) { 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 + '"' - }); - 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 - image.toBuffer("png", function(buf_err, buffer) { - // FIXME: buf_err is not handled - sendimage(rid, http_status, buffer); - }); - }); - } - } - 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); } }; \ No newline at end of file diff --git a/lib/server.js b/lib/server.js index 66a4d12..9ac0097 100644 --- a/lib/server.js +++ b/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);