Send "If-Modified-Since" header, make use of the 304 status, always fool the cache, change $.ajax.

Status Code 304: Not modified
 By sending the "If-Modified-Since" header we get a proper status code, and no response.
 This saves bandwidth for both the user and the servers, avoid unnecessary computation,
 and won't load images and scripts when parsing the response.
This commit is contained in:
Nicolas Stepien 2011-12-13 20:22:24 +01:00
parent fbfdefa3e0
commit 0a6e01accd
3 changed files with 61 additions and 23 deletions

View File

@ -326,13 +326,13 @@
$.add(d.head, script);
return $.rm(script);
},
ajax: function(url, cb, type) {
ajax: function(url, cb, type, event) {
var r;
if (type == null) type = 'get';
if (event == null) event = 'onload';
r = new XMLHttpRequest();
r.onload = cb;
r[event] = cb;
r.open(type, url, true);
r.send();
return r;
},
cache: function(url, cb) {
@ -354,6 +354,7 @@
}
return _results;
}));
req.send();
req.callbacks = [cb];
return $.cache.requests[url] = req;
}
@ -541,7 +542,6 @@
this.regexps[key].push(RegExp(f[1], f[2]));
} catch (e) {
alert(e.message);
alert(e);
}
}
this.callbacks.push(this[key]);
@ -1988,7 +1988,8 @@
$.on(input, 'click', updater.update);
}
}
return $.add(d.body, dialog);
$.add(d.body, dialog);
return updater.lastModified = 0;
},
cb: {
verbose: function() {
@ -2029,6 +2030,21 @@
return;
}
updater.timer.textContent = '-' + conf['Interval'];
/*
Status Code 304: Not modified
By sending the `If-Modified-Since` header we get a proper status code, and no response.
This saves bandwidth for both the user and the servers, avoid unnecessary computation,
and won't load images and scripts when parsing the response.
*/
updater.lastModified = this.getResponseHeader('Last-Modified');
console.log(this.status);
if (this.status === 304) {
if (conf['Verbose']) {
updater.count.textContent = '+0';
updater.count.className = null;
}
return;
}
body = $.el('body', {
innerHTML: this.responseText
});
@ -2050,7 +2066,7 @@
if (conf['Verbose']) {
updater.count.textContent = '+' + newPosts;
if (newPosts === 0) {
updater.count.className = '';
updater.count.className = null;
} else {
updater.count.className = 'new';
}
@ -2077,12 +2093,13 @@
return updater.update();
},
update: function() {
var cb, url, _ref;
var url, _ref;
updater.timer.textContent = 0;
if ((_ref = updater.request) != null) _ref.abort();
url = engine !== 'presto' ? location.pathname : location.pathname + '?' + Date.now();
cb = updater.cb.update;
return updater.request = $.ajax(url, cb);
url = location.pathname + '?' + Date.now();
updater.request = $.ajax(url, updater.cb.update);
updater.request.setRequestHeader('If-Modified-Since', updater.lastModified);
return updater.request.send();
}
};
@ -2980,12 +2997,12 @@
thumb = this.previousSibling;
imgExpand.contract(thumb);
if (engine === 'webkit') {
req = $.ajax(this.src, null, 'head');
return req.onreadystatechange = function() {
req = $.ajax(this.src, (function() {
if (this.status !== 404) {
return setTimeout(imgExpand.retry, 10000, thumb);
}
};
}), 'head', 'onreadystatechange');
return req.send();
} else if (!g.dead) {
return setTimeout(imgExpand.retry, 10000, thumb);
}

View File

@ -1,5 +1,6 @@
master
- mayhem
thread updater network optimization
prevent regexp errors with the filter
2.32.3

View File

@ -231,11 +231,10 @@ $.extend $,
textContent: "(#{code})()"
$.add d.head, script
$.rm script
ajax: (url, cb, type='get') ->
ajax: (url, cb, type='get', event='onload') ->
r = new XMLHttpRequest()
r.onload = cb
r[event] = cb
r.open type, url, true
r.send()
r
cache: (url, cb) ->
if req = $.cache.requests[url]
@ -245,6 +244,7 @@ $.extend $,
req.callbacks.push cb
else
req = $.ajax url, (-> cb.call @ for cb in @callbacks)
req.send()
req.callbacks = [cb]
$.cache.requests[url] = req
cb:
@ -1587,6 +1587,8 @@ updater =
$.add d.body, dialog
updater.lastModified = 0
cb:
verbose: ->
if conf['Verbose']
@ -1619,8 +1621,23 @@ updater =
updater.timer.textContent = '-' + conf['Interval']
###
Status Code 304: Not modified
By sending the `If-Modified-Since` header we get a proper status code, and no response.
This saves bandwidth for both the user and the servers, avoid unnecessary computation,
and won't load images and scripts when parsing the response.
###
updater.lastModified = @getResponseHeader('Last-Modified')
console.log @status
if @status is 304
if conf['Verbose']
updater.count.textContent = '+0'
updater.count.className = null
return
body = $.el 'body',
innerHTML: @responseText
#this only works on Chrome because of cross origin policy
if $('title', body).textContent is '4chan - Banned'
updater.count.textContent = 'banned'
@ -1639,7 +1656,7 @@ updater =
if conf['Verbose']
updater.count.textContent = '+' + newPosts
if newPosts is 0
updater.count.className = ''
updater.count.className = null
else
updater.count.className = 'new'
@ -1666,10 +1683,11 @@ updater =
update: ->
updater.timer.textContent = 0
updater.request?.abort()
#Opera needs to fool its cache
url = if engine isnt 'presto' then location.pathname else location.pathname + '?' + Date.now()
cb = updater.cb.update
updater.request = $.ajax url, cb
#fool the cache
url = location.pathname + '?' + Date.now()
updater.request = $.ajax url, updater.cb.update
updater.request.setRequestHeader 'If-Modified-Since', updater.lastModified
updater.request.send()
watcher =
init: ->
@ -2302,8 +2320,10 @@ imgExpand =
imgExpand.contract thumb
#navigator.online is not x-browser/os yet
if engine is 'webkit'
req = $.ajax @src, null, 'head'
req.onreadystatechange = -> setTimeout imgExpand.retry, 10000, thumb if @status isnt 404
req = $.ajax @src, (->
setTimeout imgExpand.retry, 10000, thumb if @status isnt 404
), 'head', 'onreadystatechange'
req.send()
#Firefox returns a status code of 0 because of the same origin policy
#Oprah doesn't send any request
else unless g.dead