2010-02-22 3 views
4

Я написал сервер css, который выполняет минимизацию и базовую парсинг/замену var. Сервер использует node.js.gzip без поддержки сервера?

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

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

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

Кроме того, некоторые независимые gzip-тестеры также терпят неудачу (а не только Chrome).

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

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

Спасибо.

UPDATE Я проверил мой Content-Length является правильным

ответ

1

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

+0

Содержимое gzipped _before_ отправлено в браузер. Как бы браузер не имел правильную длину? Однако я попробую это. Я в отчаянии.:) – Spot

+0

Его дело в том, что если ваш сервер указал длину предварительного сжатия как заголовок, у вас будет незаконный ответ HTTP. Вы можете легко изучить заголовки с помощью Fiddler или аналогичного. – EricLaw

+0

Хорошо, что это не исправить, к сожалению. – Spot

2

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

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

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

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

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

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

+0

Моя проблема на самом деле оказалась проблемой длины содержимого, но была заблокирована другой коварной проблемой. Однако вы правы, V8 нуждается в том, чтобы этот материал был реализован и быстро! :) Спасибо за ответ. – Spot

+0

Узел объединил ветвь net2. Вы можете использовать двоичные данные с буфером в buffer.js. – nalply

+0

@spot так что исходный вопрос все еще действителен? – ordnungswidrig

Смежные вопросы