Подтвердить что ты не робот

Сжатие HTTP-сообщений, отправленных из браузера

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

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

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

4b9b3361

Ответ 1

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

HAAHAHAAahahahahahhaha.

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

$value = gzinflate(base64_decode(preg_replace('/\s/', '+',$value)));