Как мне эффективно получить доступ к gzipped xml из javascript? - PullRequest
4 голосов
/ 06 марта 2011

Мне нужен эффективный доступ к большому 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, но я еще не получил это работает.)

1 Ответ

1 голос
/ 07 марта 2011

Вы просто не сможете заметно улучшиться с этой конфигурацией **.

JavaScript слишком медленный, чтобы раздувать так быстро, как хотелось бы, и вы не можете надежно вызвать двоичный файл из JS - если только AJAX не отправляет данные на ваш собственный сервер (который может быть локальным ПК).

Ваши варианты улучшения могут выглядеть так:

  1. Получить браузер для автоматического раздувания контента. Если вы уже пытались использовать overrideMimeType для установки application/x-gzip, вместо этого вы можете попробовать GM_xmlhttpRequest (это длинный выстрел).

  2. Преобразуйте это из скрипта GM в дополнение к Firefox. В качестве дополнения вы можете получить доступ к двоичным файлам, таким как 7-Zip , и даже можете иметь доступ к методу надувания браузера. Возможно, вы могли бы подделать MIME-тип также проще.



** Я заметил некоторые тривиальные возможности ускорить раздувание JS ... такие вещи, как length проверки внутри циклов for. Увы, учитывая подробности, вероятно, не собираюсь покупать больше секунды или две.

...