gzip без поддержки сервера? - PullRequest
       25

gzip без поддержки сервера?

5 голосов
/ 22 февраля 2010

Я написал сервер CSS, который выполняет минимизацию и базовую замену / замену. Сервер использует node.js.

Я хочу распечатать мой ответ с этого сервера. Как сказано в IRC, в файле node.js в настоящее время нет библиотеки gzip, поэтому я пытаюсь сделать это вручную из командной строки (так как я использую gzip-файлы только в кеше).

Я помещаю данные файла во временный файл, а затем использую exec для вызова 'gzip -c -9 -q ' + tempFile. Я возвращаю сжатые данные правильно (кажется) и отправляю правильный заголовок Content-Encoding как 'gzip', но Chrome сообщает:

Error 330 (net::ERR_CONTENT_DECODING_FAILED): Unknown error.

Кроме того, некоторые независимые gzip-тестеры онлайн также не работают (не только Chrome).

Я предполагаю, что это нечто простое, чего я не знаю о генерации блоков gzip для браузеров, поскольку я никогда не пытался сделать это вручную.

Любая помощь будет полезна. Сервер работает очень быстро, но мне нужно сжать содержимое, чтобы добиться максимальной производительности для конечных пользователей.

Спасибо.

UPDATE Я подтвердил, что мой Content-Length правильный

Ответы [ 2 ]

2 голосов
/ 25 февраля 2010

Узел по-прежнему находится на переднем крае и, похоже, еще недостаточно хорошо обрабатывает двоичные данные.

Строковые кодировки узла : ascii, binary и utf8. [...] «двоичные» смотрят только на первые 8 бит из 16-битных строковых символов JavaScript. Проблема в том, что строки в соответствии с ECMA являются 16-битными символьными строками. Если вы используете UTF-8 (по умолчанию), при чтении в строку происходит некоторая нормализация, и это приводит к повреждению gzip. Если вы используете ascii, это явно не сработает.

Это будет работать, если вы используете двоичное кодирование и чтение и запись . Старшие 8 бит символа строки Javascript просто не используются. Если нет, попробуйте отправить файлы напрямую клиенту без какой-либо загрузки в строки Javascript, возможно, с помощью прокси-сервера перед Node.

Я сам надеюсь, что движок Google V8 реализует настоящий тип данных двоичной строки, что-то вроде этого предложения http://groups.google.com/group/nodejs/browse_thread/thread/648a0f5ed2c95211/ef89acfe538931a1?lnk=gst&q=binary+type#ef89acfe538931a1

CommonJS также предлагает Binary / B , и, поскольку Node пытается следовать CommonJS, есть некоторая надежда на будущее.

Редактировать Я только что обнаружил net2 ветку узла, который содержит двоичный буфер (см. Src / node_buffer.h). Кажется, это часть полной перестройки сети.

1 голос
/ 22 февраля 2010

Вы обновили Content-Length, чтобы соответствовать размеру gzipped? Кажется, что это может испортить декодирование.

...