User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b4pre) Gecko/20090401 Ubuntu/9.04 (jaunty) Shiretoko/3.5b4pre Build Identifier: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1b4pre) Gecko/20090401 Ubuntu/9.04 (jaunty) Shiretoko/3.5b4pre Folks: Thank you for Mozilla Firefox! A flagship project of openness and freedom. Also, it doesn't suck! Way to go. Occasionally a server of mine serves up an error message of about 2302 bytes in length instead of serving up the 500 KB file. When it does, Firefox-3.5b4 shows me a copy of the file itself (presumably pulled from the cache, since it didn't come from my server) with the first 2302 or so bytes of the file overwritten by the error message. The resulting corrupted file doesn't even parse according to HTML, of course. At first I thought that this was a bug in my server, so I opened a ticket on my issue tracker: http://allmydata.org/trac/tahoe/ticket/698 . In that ticket I attached some examples of the resulting corrupted file (the one with the original text pulled from cache but then overwritten by the error message). Eventually I concluded that my server wasn't really at fault (it might be giving a crummy error message, but it is still firefox's job to display the crummy error message instead of a mashup of the original file plus the crummy error message!). I've also reported this on launchpad against the Ubuntu package of Firefox-3.5b4 in Ubuntu Jaunty: https://bugs.launchpad.net/ubuntu/+source/firefox-3.5/+bug/382444 Thanks! Regards, Zooko Reproducible: Sometimes Steps to Reproduce: 1. Install the Tahoe server and get it to fail in this way. :-( 2. Point ff-3.5b4 at it, hit reload. 3. Observe interesting mashup of cached content and error message visible in your browser window. If you don't want to go through all of these steps, please observe the resulting "interesting mashup": http://allmydata.org/trac/tahoe/attachment/ticket/698/wiki.html.bz2 . I've pasted the first 4000 bytes of the actual result and expected result below. I've also pasted into "Additional Information" the first 4000 bytes of the original file -- the one that the server failed to serve up and which must have been pulled from ff's cache. Actual Results: Exception

<class 'twisted.internet.defer.FirstError'>: FirstError(<twisted.python.failure.Failure <class 'foolscap.ipb.DeadReferenceError'>>, 2)

<class 'twisted.internet.defer.FirstError'>: FirstError(<twisted.python.failure.Failure <class 'foolscap.ipb.DeadReferenceError'>>, 2)

, 19 Feb 2009) * Revision: 6246 */ (function(){var l=this,g,y=l.jQuery,p=l.$,o=l.jQuery=l.$=function(E,F){return new o.fn.init(E,F)},D=/^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,f=/^.[^:#\[\.,]*$/;o.fn=o.prototype={init:function(E,H){E=E||document;if(E.nodeType){this[0]=E;this.length=1;this.context=E;return this}if(typeof E==="string"){var G=D.exec(E);if(G&&(G[1]||!H)){if(G[1]){E=o.clean([G[1]],H)}else{var I=document.getElementById(G[3]);if(I&&I.id!=G[3]){return o().find(E)}var F=o(I||[]);F.context=document;F.selector=E;return F}}else{return o(H).find(E)}}else{if(o.isFunction(E)){return o(document).ready(E)}}if(E.selector&&E.context){this.selector=E.selector;this.context=E.context}return this.setArray(o.isArray(E)?E:o.makeArray(E))},selector:"",jquery:"1.3.2",size:function(){return this.length},get:function(E){return E===g?Array.prototype.slice.call(this):this[E]},pushStack:function(F,H,E){var G=o(F);G.prevObject=this;G.context=this.context;if(H==="find"){G.selector=this.selector+(this.selector?" ":"")+E}else{if(H){G.selector=this.selector+"."+H+"("+E+")"}}return G},setArray:function(E){this.length=0;Array.prototype.push.apply(this,E);return this},each:function(F,E){return o.each(this,F,E)},index:function(E){return o.inArray(E&&E.jquery?E[0]:E,this)},attr:function(F,H,G){var E=F;if(typeof F==="string"){if(H===g){return this[0]&&o[G||"attr"](this[0],F)}else{E={};E[F]=H}}return this.each(function(I){for(F in E){o.attr(G?this.style:this,F,o.prop(this,E[F],G,I,F))}})},css:function(E,F){if((E=="width"||E=="height")&&parseFloat(F)<0){F=g}return this.attr(E,F,"curCSS")},text:function(F){if(typeof F!=="object"&&F!=null){return this.empty().append((this[0]&&this[0].ownerDocument Expected Results: Exception

<class 'twisted.internet.defer.FirstError'>: FirstError(<twisted.python.failure.Failure <class 'foolscap.ipb.DeadReferenceError'>>, 2)

<class 'twisted.internet.defer.FirstError'>: FirstError(<twisted.python.failure.Failure <class 'foolscap.ipb.DeadReferenceError'>>, 2)