Bug Tracker

Ticket #4764: etag.diff

File etag.diff, 3.5 KB (added by lawrencepit, 13 years ago)
  • test/unit/ajax.js

     
    874874        })
    875875});
    876876
     877test("jQuery.ajax - If-Modified-Since support", function() {
     878        expect( 3 );
     879
     880        jQuery.ajaxSetup({ ifModified: true });
     881
     882        stop();
     883
     884        var url = "data/if_modified_since.php?ts=" + new Date();
     885
     886        jQuery.ajax({
     887                url: url,
     888                success: function(data, status) {
     889                        equals(status, "success");
     890                       
     891                        jQuery.ajax({
     892                                url: url,
     893                                success: function(data, status) {
     894                                        equals(status, "notmodified");
     895                                        ok(data == null, "response body should be empty")
     896                                        start();
     897                                }
     898                        });
     899                }
     900        });
     901});
     902
     903test("jQuery.ajax - Etag support", function() {
     904        expect( 3 );
     905
     906        jQuery.ajaxSetup({ ifModified: true });
     907
     908        stop();
     909
     910        var url = "data/etag.php?ts=" + new Date();
     911
     912        jQuery.ajax({
     913                url: url,
     914                success: function(data, status) {
     915                        equals(status, "success");
     916                       
     917                        jQuery.ajax({
     918                                url: url,
     919                                success: function(data, status) {
     920                                        equals(status, "notmodified");
     921                                        ok(data == null, "response body should be empty")
     922                                        start();
     923                                }
     924                        });
     925                }
     926        });
     927});
     928
    877929}
    878930
    879931//}
  • src/ajax.js

     
    170170
    171171        // Last-Modified header cache for next request
    172172        lastModified: {},
     173        etag: {},
    173174
    174175        ajax: function( s ) {
    175176                // Extend the settings, but re-extend 's' so that it can be
     
    298299                        if ( s.data )
    299300                                xhr.setRequestHeader("Content-Type", s.contentType);
    300301
    301                         // Set the If-Modified-Since header, if ifModified mode.
    302                         if ( s.ifModified )
    303                                 xhr.setRequestHeader("If-Modified-Since",
    304                                         jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" );
     302                                // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
     303                                if ( s.ifModified ) {
     304                                        if (jQuery.lastModified[s.url])
     305                                                xhr.setRequestHeader("If-Modified-Since", jQuery.lastModified[s.url]);
     306                                        if (jQuery.etag[s.url])
     307                                                xhr.setRequestHeader("If-None-Match", jQuery.etag[s.url]);
     308                                }
    305309
    306310                        // Set header so the called script knows that it's an XMLHttpRequest
    307311                        xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
     
    363367                                }
    364368
    365369                                // Make sure that the request was successful or notmodified
    366                                 if ( status == "success" ) {
    367                                         // Cache Last-Modified header, if ifModified mode.
    368                                         var modRes;
    369                                         try {
    370                                                 modRes = xhr.getResponseHeader("Last-Modified");
    371                                         } catch(e) {} // swallow exception thrown by FF if header is not available
    372 
    373                                         if ( s.ifModified && modRes )
    374                                                 jQuery.lastModified[s.url] = modRes;
    375 
     370                                if ( status == "success" || status == "notmodified" ) {
    376371                                        // JSONP handles its own success callback
    377372                                        if ( !jsonp )
    378373                                                success();
     
    467462
    468463        // Determines if an XMLHttpRequest returns NotModified
    469464        httpNotModified: function( xhr, url ) {
    470                 try {
    471                         var xhrRes = xhr.getResponseHeader("Last-Modified");
     465                var last_modified = xhr.getResponseHeader("Last-Modified");
     466                var etag = xhr.getResponseHeader("Etag");
    472467
    473                         // Firefox always returns 200. check Last-Modified date
    474                         return xhr.status == 304 || xhrRes == jQuery.lastModified[url];
    475                 } catch(e){}
    476                 return false;
     468                if (last_modified)
     469                        jQuery.lastModified[url] = last_modified;
     470
     471                if (etag)
     472                        jQuery.etag[url] = etag;
     473
     474                return xhr.status == 304;
    477475        },
    478476
    479477        httpData: function( xhr, type, s ) {