Skip to content
Permalink
Browse files

Fixes #8095. Properly handles the case where browser cache needs to b…

…e bypassed while server-side logic still delivers proper 304 responses. Unit test added.
  • Loading branch information...
jaubourg committed Jan 31, 2011
1 parent e0b1bb8 commit f43572d3b86074afc561822b7fd9592e1f05d19b
Showing with 99 additions and 84 deletions.
  1. +12 −6 src/ajax.js
  2. +87 −78 test/unit/ajax.js
@@ -350,6 +350,8 @@ jQuery.extend({
completeDeferred = jQuery._Deferred(),
// Status-dependent callbacks
statusCode = s.statusCode || {},
// ifModified key
ifModifiedKey,
// Headers (they are sent all at once)
requestHeaders = {},
// Response headers
@@ -453,10 +455,10 @@ jQuery.extend({
if ( s.ifModified ) {

if ( ( lastModified = jXHR.getResponseHeader( "Last-Modified" ) ) ) {
jQuery.lastModified[ s.url ] = lastModified;
jQuery.lastModified[ ifModifiedKey ] = lastModified;
}
if ( ( etag = jXHR.getResponseHeader( "Etag" ) ) ) {
jQuery.etag[ s.url ] = etag;
jQuery.etag[ ifModifiedKey ] = etag;
}
}

@@ -590,6 +592,9 @@ jQuery.extend({
s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
}

// Get ifModifiedKey before adding the anti-cache parameter
ifModifiedKey = s.url;

// Add anti-cache in url if needed
if ( s.cache === false ) {

@@ -609,11 +614,12 @@ jQuery.extend({

// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
if ( s.ifModified ) {
if ( jQuery.lastModified[ s.url ] ) {
requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ s.url ];
ifModifiedKey = ifModifiedKey || s.url;
if ( jQuery.lastModified[ ifModifiedKey ] ) {
requestHeaders[ "if-modified-since" ] = jQuery.lastModified[ ifModifiedKey ];
}
if ( jQuery.etag[ s.url ] ) {
requestHeaders[ "if-none-match" ] = jQuery.etag[ s.url ];
if ( jQuery.etag[ ifModifiedKey ] ) {
requestHeaders[ "if-none-match" ] = jQuery.etag[ ifModifiedKey ];
}
}

@@ -1867,96 +1867,105 @@ test("data option: empty bodies for non-GET requests", function() {
});
});

test("jQuery.ajax - If-Modified-Since support", function() {
expect( 3 );
var ifModifiedNow = new Date();

stop();
jQuery.each( { " (cache)": true, " (no cache)": false }, function( label, cache ) {

var url = "data/if_modified_since.php?ts=" + new Date();
test("jQuery.ajax - If-Modified-Since support" + label, function() {
expect( 3 );

jQuery.ajax({
url: url,
ifModified: true,
success: function(data, status) {
equals(status, "success");
stop();

jQuery.ajax({
url: url,
ifModified: true,
success: function(data, status) {
if ( data === "FAIL" ) {
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
ok(true, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
} else {
equals(status, "notmodified");
ok(data == null, "response body should be empty");
var url = "data/if_modified_since.php?ts=" + ifModifiedNow++;

jQuery.ajax({
url: url,
ifModified: true,
cache: cache,
success: function(data, status) {
equals(status, "success" );

jQuery.ajax({
url: url,
ifModified: true,
cache: cache,
success: function(data, status) {
if ( data === "FAIL" ) {
ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-Modified-Since').");
} else {
equals(status, "notmodified");
ok(data == null, "response body should be empty");
}
start();
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
ok(jQuery.browser.opera, "error");
start();
}
start();
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
ok(jQuery.browser.opera, "error");
start();
}
});
},
error: function() {
equals(false, "error");
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
start();
}
});
},
error: function() {
equals(false, "error");
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
start();
}
});
});
});

test("jQuery.ajax - Etag support", function() {
expect( 3 );
test("jQuery.ajax - Etag support" + label, function() {
expect( 3 );

stop();
stop();

var url = "data/etag.php?ts=" + new Date();
var url = "data/etag.php?ts=" + ifModifiedNow++;

jQuery.ajax({
url: url,
ifModified: true,
success: function(data, status) {
equals(status, "success");
jQuery.ajax({
url: url,
ifModified: true,
cache: cache,
success: function(data, status) {
equals(status, "success" );

jQuery.ajax({
url: url,
ifModified: true,
success: function(data, status) {
if ( data === "FAIL" ) {
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
ok(true, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
} else {
equals(status, "notmodified");
ok(data == null, "response body should be empty");
jQuery.ajax({
url: url,
ifModified: true,
cache: cache,
success: function(data, status) {
if ( data === "FAIL" ) {
ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
ok(jQuery.browser.opera, "Opera is incapable of doing .setRequestHeader('If-None-Match').");
} else {
equals(status, "notmodified");
ok(data == null, "response body should be empty");
}
start();
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
ok(jQuery.browser.opera, "error");
start();
}
start();
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
ok(jQuery.browser.opera, "error");
start();
}
});
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
start();
}
});
},
error: function() {
// Do this because opera simply refuses to implement 304 handling :(
// A feature-driven way of detecting this would be appreciated
// See: http://gist.github.com/599419
ok(jQuery.browser.opera, "error");
start();
}
});
});
});

0 comments on commit f43572d

Please sign in to comment.
You can’t perform that action at this time.