Почему браузер не может отправить запрос gzip? - PullRequest
66 голосов
/ 08 января 2009

Если веб-сервер может отправить ответ gzip, почему браузер не может отправить запрос gzip?

Ответы [ 6 ]

59 голосов
/ 08 января 2009

Клиент и сервер должны договориться о том, как общаться; Часть этого - может ли связь быть сжатой. HTTP был задуман как модель запроса / ответа, и предполагалось, что первоначальное создание всегда будет иметь небольшие запросы и потенциально большие ответы. Сжатие не требуется для реализации HTTP, есть серверы и клиенты, которые его не поддерживают.

Сжатие HTTP осуществляется клиентом, говоря, что он может поддерживать сжатие, и если сервер видит это в запросе и поддерживает сжатие, он может сжать ответ. Чтобы сжимать запрос, клиент должен был бы иметь «предварительный запрос», который фактически согласовывал бы, что запрос будет сжат, ИЛИ он должен был бы требовать сжатия в качестве поддерживаемой кодировки для ВСЕХ запросов.

* ОБНОВЛЕНИЕ февраль '17 * Прошло 8 лет, но, как отмечает @ Phil_1984_, третье возможное решение - клиент и сервер договориться о поддержке сжатия, а затем использовать ее для последующих запросов. Фактически, такие вещи, как HSTS, работают именно так с клиентским кэшированием, которое сервер ожидает только на TLS и игнорирует все незашифрованные ссылки. HTTP был явно разработан так, что он не имеет состояния, но на данный момент мы вышли за рамки этого.

27 голосов
/ 08 января 2009

Клиент не может знать заранее, что сервер будет понимать запрос gzipped, но сервер может знать, что клиент его примет.

7 голосов
/ 10 апреля 2009

Может, при условии, что это может гарантировать, что сервер примет это. Это может означать использование запроса OPTIONS.

Есть много вещей, которые веб-браузеры могут делать (например, конвейерная обработка), которые они не делают. Разработчики веб-браузера учитывают последствия изменения совместимости.

В гетерогенной среде существует множество различных веб-серверов и конфигураций. Внесение изменений в работу клиента может нарушить некоторые из них.

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

Исторически было много неработающих реализаций клиент / сервер - долгое время gzip-ответы ломались в основных веб-браузерах (к счастью, в настоящее время они в основном пропали).

Таким образом, вы получите черные списки пользовательских агентов или серверов (или доменных имен), где эти опции были автоматически отключены, что неприятно.

3 голосов
/ 08 января 2009

Потому что он не знает, что сервер может принять это. У транзакции HTTP есть единственный запрос, отправленный клиентом, сопровождаемый ответом. Одна из вещей, которую отправляет клиент, это то, что кодирование / сжатие он может поддерживать Затем сервер может решить, как сжать ответ. У клиента нет этой роскоши.

2 голосов
/ 14 сентября 2009

Если вы пишете веб-приложение, я предполагаю, что вы контролируете, что отправляется клиенту, а что отправляется обратно от клиента.

Было бы достаточно легко написать реализацию gzip в javascript, которая сжимает данные постов, отправляемые на сервер. Сервер может иметь фильтр (термин j2ee), который знает, что данные клиента отправляются сжатыми, этот фильтр распаковывает данные и затем передает данные сервлету (или классам действий в Struts), которые считывают данные как обычно, например, request.getParameter (...).

Это кажется вполне логичным и выполнимым, если вы контролируете ситуацию. Как упоминалось в других публикациях, вы не можете полагаться на то, что браузер сделает это автоматически, но, поскольку вы пишете веб-страницы, вы можете заставить браузер выполнять сжатие, которое вам нужно (с небольшой работой).

Энди.

0 голосов
/ 03 июня 2017

HTTP разработан следующим образом:

  • Клиент говорит свой запрос в виде простого текста (в том числе, если может понять сжатые ответы)
  • Сервер отвечает кодировкой пропппера (сжатой или нет)

НО В ЭТОМ ДИЗАЙНЕ клиент не может отправлять сжатые запросы, потому что он не знает, поймет ли сервер заранее.

...