Сжатие данных HTTP Post, отправленных из браузера

Я хочу отправить сжатые данные POST с помощью Javascript на сервер, которым я управляю. Есть ли способ позволить HTTP-уровню справиться со сжатием.

Я отправляю JSON. Если я установлю тип содержимого на GZIP/deflate, будет ли браузер автоматически сжимать его, а затем Apache с модом deflate автоматически распакует его, чтобы моему приложению вообще не приходилось думать о сжатых данных?

Я знаю, что это может работать наоборот, но есть ли способ заставить это работать таким образом?

3 ответа

Решение

Будет ли браузер автоматически GZIP-кодировать ваши данные для вас? Краткий ответ: нет.

Длинный ответ заключается в том, что некоторые пользовательские агенты могут делать такие вещи, но вы определенно не можете полагаться на это. Состояние документации apache mod_deflate:

некоторые специальные приложения поддерживают сжатие запросов, например, некоторые клиенты WebDAV.

Так что нет, это не сработает. Вам нужно будет сгенерировать соответствующее сообщение HTTP-запроса самостоятельно. Соответствующий заголовок в этом случае Content-Encoding: gzip и не Content-Type: потому что сам контент application/json вы просто хотите закодировать тело сущности вашего сообщения HTTP-запроса для транспорта.

Обратите внимание, что вам нужно также добавить соответствующие Content-Length: заголовок, указывающий размер в байтах тела сущности сообщения после сжатия. -ИЛИ- отправить сообщение HTTP, используя Transfer-Encoding: chunked и отказаться от спецификации длины содержимого.

На приемном конце вы можете поручить mod_deflate использовать входной фильтр для распаковки информации:

<Location /dav-area>
SetInputFilter DEFLATE
</Location>

Это немного сложно, если вы получаете сжатые тела сообщений только для пары ресурсов. Вместо этого вам, вероятно, следует просто использовать клиентский скрипт для проверки Content-Encoding: gzip заголовок и распакуйте тело запроса вручную. Как это сделать, скажем, PHP, это совсем другой вопрос. Если вам нужны подробности для этого, вы должны опубликовать еще один вопрос.

Это возможно, но я бы настоятельно рекомендовал не принимать данные в формате gzip, поступающие на ваш сервер. Основной причиной является предотвращение взрыва gzip на вашем сервере. Как правило, невозможно узнать, как выглядят несжатые данные, прежде чем распаковывать их, поэтому пользователь может отправить вам веб-запрос, который выглядит как безобидный 1 КБ или 1 МБ данных, но на самом деле это 100 ГБ данных, а затем ваш веб Сервер (nginx или apache) зависает в течение следующих 10 минут, пытаясь распаковать все это, в конечном итоге не хватает памяти / блокировки.

Только что достиг этого, используя https://github.com/dankogai/js-deflate Однако по каким-либо причинам постданные удалят знаки + и заменят их пробелами.

Чтобы отправить данные через JavaScript:

params.mapdata=  btoa(RawDeflate.deflate(JSON.stringify(mapdata)));

Чтобы получить данные через php:

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));
Другие вопросы по тегам