Мне нужен эффективный доступ к большому gzipped xml-файлу из javascript (на самом деле из Greasemonkey).
К сожалению, сервер не предоставляет заголовок Content-Encoding, а Content-Type - "application / x-gzip", поэтому firefox не будет (насколько я могу судить) автоматически его раздувать.
Если есть способ подделать Firefox, это было бы идеально. Если не считать этого, мне нужен какой-то способ для эффективной инфляции ... то, что я сейчас использую, занимает около 30 секунд, чтобы сжать файл 1.2Mb gzipped; Я хотел бы получить его менее чем за 5 секунд.
(Сценарий Greasemonkey, над которым я работаю, не может иметь никаких других зависимостей от внешнего сервера, поэтому проксирование и представление заголовка Content-Encoding не возможны.)
То, что я делаю сейчас, я собрал воедино из нескольких мест. Чтобы получить двоичные данные без изменений, я использую расширение firefox XMLHTTPRequest overrideMimeType :
$.ajax(url, {
dataType:'text',
beforeSend:function(xhr){
xhr.overrideMimeType('text/plain; charset=x-user-defined')
},
success:function(data){
var blob='';
for (i=0; i<data.length; ++i)
blob += String.fromCharCode(data.charCodeAt(i) & 0xff);
...
Затем надувание, используя слегка измененную и встроенную копию https://github.com/dankogai/js-deflate/blob/master/rawinflate.js (есть несколько других библиотек раздувания javascript, все, насколько я могу судить, основанные на более старой библиотеке http://www.onicos.com/staff/iz/amuse/javascript/expert/inflate.txt). Это ужасно медленная часть.
// blithely assuming the gzip header won't change,
// strip a fixed number of bytes from the front
deflated=RawDeflate.inflate(blob.substring(22,blob.length-8));
Затем вывести его в свойство innerHTML для его анализа:
xmlcontainer=$('<div>');
// remove <?xml...> prolog
xmlcontainer.html(deflated.substring(45));
xmldoc=xmldoc.children();
(я знаю, что последний бит мог бы быть более правильно сделан с parseFromString DOMParser, но я еще не получил это работает.)