[Pkg-javascript-commits] [node-static] 80/151: Fix for requests having both If-None-Match && If-Modified-Since
Tonnerre Lombard
tonnerre-guest at moszumanska.debian.org
Tue Jan 7 23:18:00 UTC 2014
This is an automated email from the git hooks/post-receive script.
tonnerre-guest pushed a commit to branch master
in repository node-static.
commit f592d8a884084c39b002a38b84fbbaddaf82dc66
Author: Ben Weintraub <ben at deckmonitoring.com>
Date: Tue Sep 25 13:27:27 2012 -0700
Fix for requests having both If-None-Match && If-Modified-Since
Previously, requests having both the If-None-Match and If-Modified-Since headers
would be serviced with a 304 response if either condition were to pass. This is
not correct per RFC 2616, section 14.26 (see below).
Also, added a new test to verify behavior with If-None-Match condition fails,
but If-Modified-Since condition passes.
From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.26 :
"If none of the entity tags match, then the server MAY perform the requested
method as if the If-None-Match header field did not exist, but MUST also ignore
any If-Modified-Since header field(s) in the request. That is, if no entity
tags match, then the server MUST NOT return a 304 (Not Modified) response."
---
lib/node-static.js | 13 ++++++++-----
test/integration/node-static-test.js | 22 ++++++++++++++++++++++
2 files changed, 30 insertions(+), 5 deletions(-)
diff --git a/lib/node-static.js b/lib/node-static.js
index 136311b..db16685 100644
--- a/lib/node-static.js
+++ b/lib/node-static.js
@@ -180,9 +180,11 @@ this.Server.prototype.serve = function (req, res, callback) {
};
this.Server.prototype.respond = function (pathname, status, _headers, files, stat, req, res, finish) {
- var mtime = Date.parse(stat.mtime),
- key = pathname || files[0],
- headers = {};
+ var mtime = Date.parse(stat.mtime),
+ key = pathname || files[0],
+ headers = {},
+ clientETag = req.headers['if-none-match'],
+ clientMTime = Date.parse(req.headers['if-modified-since']);
// Copy default headers
for (var k in this.options.headers) { headers[k] = this.options.headers[k] }
@@ -194,8 +196,9 @@ this.Server.prototype.respond = function (pathname, status, _headers, files, sta
// Conditional GET
// If the "If-Modified-Since" or "If-None-Match" headers
// match the conditions, send a 304 Not Modified.
- if (req.headers['if-none-match'] === headers['ETag'] ||
- Date.parse(req.headers['if-modified-since']) >= mtime) {
+ if ((clientMTime || clientETag) &&
+ (!clientETag || clientETag === headers['ETag']) &&
+ (!clientMTime || clientMTime >= mtime)) {
finish(304, headers);
} else {
var fileExtension = path.extname(files[0]).slice(1).toLowerCase();
diff --git a/test/integration/node-static-test.js b/test/integration/node-static-test.js
index 5501343..0d65cfc 100644
--- a/test/integration/node-static-test.js
+++ b/test/integration/node-static-test.js
@@ -90,6 +90,28 @@ suite.addBatch({
'should respond with 304' : function(error, response, body){
assert.equal(response.statusCode, 304);
}
+ },
+ 'requesting with If-None-Match and If-Modified-Since': {
+ topic : function(){
+ var _this = this;
+ request.get(TEST_SERVER + '/index.html', function(error, response, body){
+ var modified = Date.parse(response.headers['last-modified']);
+ var oneDayLater = new Date(modified + (24 * 60 * 60 * 1000)).toUTCString();
+ var nonMatchingEtag = '1111222233334444';
+ request({
+ method: 'GET',
+ uri: TEST_SERVER + '/index.html',
+ headers: {
+ 'if-none-match': nonMatchingEtag,
+ 'if-modified-since': oneDayLater
+ }
+ },
+ _this.callback);
+ });
+ },
+ 'should respond with a 200': function(error, response, body){
+ assert.equal(response.statusCode, 200);
+ }
}
}).addBatch({
'requesting HEAD': {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-static.git
More information about the Pkg-javascript-commits
mailing list