Qual é o estado atual das coisas quando se trata de fazer
Transfer-Encoding: gzip
ou um
Content-Encoding: gzip
quando desejo permitir que clientes com, por exemplo, largura de banda limitada, sinalizem sua disposição de aceitar uma resposta compactada e o servidor tenha a palavra final se deve compactar ou não .
O último é o que, por exemplo, o mod_deflate do Apache e o IIS fazem, se você permitir que ele cuide da compactação. Dependendo do tamanho do conteúdo a ser compactado, ele fará o adicional Transfer-Encoding: chunked
.
Também incluirá um Vary: Accept-Encoding
, que já indica o problema. Content-Encoding
parece ser parte da entidade, portanto, alterar os Content-Encoding
valores para uma alteração da entidade, ou seja, um Accept-Encoding
cabeçalho diferente significa, por exemplo, um cache não pode usar sua versão em cache da entidade idêntica de outra forma.
Existe uma resposta definitiva sobre isso que eu perdi (e que não está enterrada dentro de uma mensagem em uma longa discussão em algum grupo de notícias do Apache)?
Minha impressão atual é:
- A codificação de transferência seria, de fato, a maneira certa de fazer o que geralmente é feito com a codificação de conteúdo pelas implementações existentes de servidor e cliente
- A codificação de conteúdo, por causa de suas implicações semânticas, traz alguns problemas (o que o servidor deve fazer para
ETag
quando comprime uma resposta de forma transparente?) - O motivo é frango'n'egg: os navegadores não suportam porque os servidores não, porque os navegadores não
Portanto, estou assumindo que o caminho certo seria um Transfer-Encoding: gzip
(ou, se eu adicionalmente dividir o corpo, ele se tornaria Transfer-Encoding: gzip, chunked
). E não há razão para tocar em Vary
ou ETag
ou qualquer outro cabeçalho nesse caso, pois é uma coisa de nível de transporte.
Por enquanto, não me importo muito com o 'salto a salto' de Transfer-Encoding
, algo que os outros parecem estar preocupados em primeiro lugar, porque os proxies podem descompactar e encaminhar descompactado para o cliente. No entanto, os proxies podem muito bem encaminhá-lo no estado em que se encontra (compactado), se a solicitação original tiver o Accept-Encoding
cabeçalho adequado , o que, no caso de todos os navegadores que conheço, é um dado adquirido.
A propósito, esse problema já existe há pelo menos uma década, consulte, por exemplo, https://bugzilla.mozilla.org/show_bug.cgi?id=68517 .
Qualquer esclarecimento sobre isso será apreciado. Tanto em termos do que é considerado compatível com os padrões quanto do que é considerado prático. Por exemplo, as bibliotecas de cliente HTTP que suportam apenas "Codificação de conteúdo" transparente seriam um argumento contra a praticidade.
fonte
Transfer-Encoding:gzip
, embora curl de linha de comando sim. Para ficar no lado seguro, envie ambos, a menos que você esteja combinando chunked e gzip.Respostas:
Citando Roy T. Fielding , um dos autores da RFC 2616:
Fonte: https://issues.apache.org/bugzilla/show_bug.cgi?id=39727#c31
Em outras palavras: não faça a codificação de conteúdo em tempo real , use a codificação de transferência!
Editar: isto é, a menos que você queira servir conteúdo compactado com gzip para clientes que só entendem Content-Encoding . Que, infelizmente, parece ser a maioria deles. Mas esteja ciente de que você sai dos domínios da especificação e pode encontrar problemas como o mencionado por Fielding, bem como outros, por exemplo, quando proxies de cache estão envolvidos.
fonte
TE: gzip
. E então seu servidor deve seguir a rota Transfer-Encoding. Se o cliente só falaAccept-Encoding: gzip
, tem que fazer doContent-Encoding
jeito. Se o cliente não especificar nenhum em sua solicitação, o servidor não deve usar gzip.O uso correto , conforme definido no RFC 2616 e realmente implementado in the wild, é para o cliente enviar um
Accept-Encoding
cabeçalho de solicitação (o cliente pode especificar várias codificações). O servidor pode então, e somente então, codificar a resposta de acordo com as codificações suportadas pelo cliente (se os dados do arquivo ainda não estiverem armazenados nessa codificação), indicar noContent-Encoding
cabeçalho da resposta qual codificação está sendo usada. O cliente pode então ler os dados do soquete com base noTransfer-Encoding
(ou seja,chunked
) e decodificá-los com base noContent-Encoding
(ou seja:)gzip
.Portanto, no seu caso, o cliente enviaria um
Accept-Encoding: gzip
cabeçalho de solicitação e, em seguida, o servidor pode decidir compactar (se já não estiver) e enviar umContent-Encoding: gzip
e, opcionalmente, umTransfer-Encoding: chunked
cabeçalho de resposta.E sim, o
Transfer-Encoding
cabeçalho pode ser usado em solicitações, mas apenas para HTTP 1.1, o que requer que as implementações de cliente e servidor suportem achunked
codificação em ambas as direções.ETag
identifica exclusivamente os dados de recursos no servidor, não os dados realmente sendo transmitidos. Se um determinado recurso de URL muda seuETag
valor, significa que os dados do lado do servidor para esse recurso mudaram.fonte
Content-Encoding
requer diferenteETag
Este é o problema do bug mod_deflate a que me refiro em minha resposta. Me faz pensar por que esse detalhe no nível do aplicativo está no padrão HTTP em primeiro lugar.Transfer-Encoding
No entanto, ao usar uma configuração de nível de transporte, não há necessidade de alterar oETag
. Exceto que ninguém implementou Transfer-Enc.Content-Encoding
vsTransfer-Encoding
. Sim, o gzip deve ser propriedade da transferência de um recurso, se feito em tempo real. Por outro lado, se o recurso for armazenado compactado no servidor, ele deve ser uma propriedade do conteúdo do recurso, se enviado no estado em que se encontra. Mas o que deveria ser e o que realmente é nem sempre são a mesma coisa.