Каково текущее положение дел, когда дело доходит до того, нужно ли делать
Transfer-Encoding: gzip
или
Content-Encoding: gzip
когда я хочу разрешить клиентам, например, с ограниченной пропускной способностью, сигнализировать о своей готовности принять сжатый ответ, и последнее слово остается за сервером, сжимать или нет .
Последнее - то, что делают, например, Apache mod_deflate и IIS, если вы позволите ему позаботиться о сжатии. В зависимости от размера сжимаемого содержимого он будет выполнять дополнительные функции Transfer-Encoding: chunked
.
Он также будет включать в себя Vary: Accept-Encoding
, который уже намекает на проблему. Content-Encoding
кажется, является частью объекта, поэтому изменение Content-Encoding
сумм означает изменение объекта, то есть другой Accept-Encoding
заголовок означает, например, что кеш не может использовать свою кэшированную версию идентичного объекта.
Есть ли определенный ответ на этот вопрос, который я пропустил (и который не похоронен внутри сообщения в длинной цепочке какой-нибудь группы новостей apache)?
Мое текущее впечатление:
- Transfer-Encoding на самом деле будет правильным способом сделать то, что в основном делается с Content-Encoding существующими серверными и клиентскими реализациями.
- Content-Encoding из-за своего семантического значения несет в себе несколько проблем (что должен делать сервер,
ETag
когда он прозрачно сжимает ответ?) - Причина в том, что это курица и яйцо: браузеры не поддерживают ее, потому что серверы не поддерживают ее, потому что браузеры не поддерживают ее.
Итак, я предполагаю, что правильным способом будет Transfer-Encoding: gzip
(или, если я дополнительно разделю тело, оно станет Transfer-Encoding: gzip, chunked
). И нет причин трогать Vary
или ETag
или любой другой заголовок в этом случае, поскольку это вещь транспортного уровня.
На данный момент меня не слишком заботит "переход за шагом" Transfer-Encoding
, то, что, кажется, беспокоит других в первую очередь, потому что прокси-серверы могут распаковывать и пересылать несжатые данные клиенту. Однако прокси-серверы могут пересылать его как есть (сжатый), если исходный запрос имеет правильный Accept-Encoding
заголовок, что для всех известных мне браузеров является заданным.
Кстати, этой проблеме как минимум десять лет, см., Например, https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
Мы будем благодарны за любые разъяснения по этому поводу. И с точки зрения того, что считается соответствующим стандартам, и с точки зрения практичности. Например, клиентские библиотеки HTTP, поддерживающие только прозрачное «Content-Encoding», будут аргументом против практичности.