From 15e645ca92da31e345e9849e3674262b7f3162f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Tue, 24 May 2011 23:52:02 +0200 Subject: [PATCH] Use digest() method in body if available, and only set ETag header if truthy. --- lib/stick/middleware/etag.js | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/stick/middleware/etag.js b/lib/stick/middleware/etag.js index 9d853bf..a3d498a 100644 --- a/lib/stick/middleware/etag.js +++ b/lib/stick/middleware/etag.js @@ -34,27 +34,33 @@ exports.middleware = function etag(next, app) { var {status, headers, body} = res; if (status === 200) { - var etags; + var etags, etag; var header = request.headers["if-none-match"]; if (header) { etags = header.split(",").map(function(s) s.trim()); } - // we can't rely on body having map(), so we fake it with forEach() - var binBody = []; - body.forEach(function(part) { - binBody.push(part.toByteString()); - }); - var etag = '"' + digest(binBody) + '"'; - headers = Headers(headers); - headers.set("ETag", etag); + // if body provides a digest() method use that + if (typeof body.digest === "function") { + etag = body.digest(); + } else { + // we can't rely on body having map(), so we fake it with forEach() + var binBody = []; + body.forEach(function(part) { + binBody.push(part.toByteString()); + }); + etag = digest(binBody); + } + if (etag) { + headers = Headers(headers); + headers.set("ETag", '"' + etag + '"'); + } if (etags && strings.contains(etags, etag)) { // return not-modified response headers.unset('Content-Length'); return {status: 304, headers: headers, body: []}; } - // body has been converted to ByteStrings as a byproduct of digest() res.body = binBody; }