É possível ativar a compactação http para solicitações?

35

Vejo muitas informações sobre a ativação da compactação http para respostas do servidor, mas e sobre solicitações recebidas. Não faria sentido para os navegadores compactar postagens grandes antes de enviá-las ao servidor?

Outro exemplo é um serviço da web REST que usamos. Temos que enviar solicitações frequentes de PUT com arquivos XML grandes (10 ou mais MB) e definitivamente veríamos alguns benefícios de largura de banda / velocidade de ambos os lados.

Portanto, esse é um problema resolvido no servidor ou cada aplicativo Web precisa lidar com isso individualmente?

Mike L
fonte

Respostas:

30

Para PUTdados no servidor compactado, você deve compactar o corpo da solicitação e definir o Content-Encoding: gzipcabeçalho. O cabeçalho em si deve ser descompactado. Está documentado em mod_deflate :

O módulo mod_deflate também fornece um filtro para descomprimir um corpo de solicitação compactado gzip. Para ativar esse recurso, você deve inserir o filtro DEFLATE na cadeia de filtros de entrada usando SetInputFilter ou AddInputFilter.

...

Agora, se uma solicitação contiver um cabeçalho Content-Encoding: gzip, o corpo será descompactado automaticamente. Poucos navegadores têm a capacidade de compactar os corpos de solicitação. No entanto, alguns aplicativos especiais oferecem suporte à compactação de solicitações, por exemplo, alguns clientes WebDAV.

E um artigo que descreve está aqui :

Então como você faz isso? Aqui está uma sinopse, novamente a partir do código fonte mod_deflate: trabalhe apenas na solicitação principal / sem sub-requisições. Isso significa que todo o corpo da solicitação deve ser compactado com gzip se optarmos por usá-lo, não é possível compactar apenas a parte que contém o arquivo, por exemplo, em uma solicitação com várias partes.

Separadamente, um navegador pode solicitar que o conteúdo da resposta do servidor seja compactado definindo o Accept-Encodingcabeçalho conforme aqui :

GET /index.html HTTP/1.1
Host: www.http-compression.com
Accept-Encoding: gzip
User-Agent: Firefox/1.0

Isso retornará dados compactados para o navegador.

Andy
fonte
5
+1 NB Você escreve you must compress the whole request, inclusive of header. No entanto, os cabeçalhos http não devem ser compactados . A única coisa que precisa ser compactada (na íntegra, como o artigo que você cita corretamente declara), é o corpo do http.
Eugene Beresovsky
1
Isso está errado: Accept-Encodinginforma ao servidor qual compressão o cliente suporta. O cabeçalho Content-Encodingdescreve a compressão do corpo.
Maaartinus 12/08
@maaartinus ver primeira citação segundo parágrafo. Reorganizei a resposta para maior clareza.
Andy Andy
4

Respondendo à parte sobre solicitações compactadas, não respostas: sim, é possível, mesmo que não pareça estar em uso generalizado. O aplicativo do lado do cliente precisa definir o cabeçalho de codificação de conteúdo apropriado. Quanto ao aplicativo do lado do servidor, existem 2 opções:

  1. o aplicativo suporta a reinflação do corpo da solicitação por si só. Um exemplo de biblioteca que pode fazer isso é o phpxmlrpc.

  2. o servidor da web infla o corpo da resposta antes de passá-lo para o aplicativo. Isso é possível usando fe o filtro mod_deflate do Apache e configurando um inputFilter

gggeek
fonte
2

Não nativamente de qualquer navegador que eu conheça, você precisaria encontrar um plug-in que faria isso por você. Você basicamente precisa definir o cabeçalho HTTP de codificação de conteúdo para informar ao servidor como a solicitação está chegando. O servidor, é claro, precisa ser capaz de lidar com essa codificação.

squillman
fonte
0

Isso não é permitido. De acordo com a especificação HTTP ( RFC 2616 ), Content-EncodingNÃO é um dos campos possíveis do cabeçalho da solicitação; portanto, não é possível compactar o corpo da entidade da solicitação, pois não há uma maneira legal de informar o servidor de que isso ocorreu. Qualquer compactação do corpo da solicitação é feita apenas como uma extensão não padrão.

Steve
fonte
12
Esta resposta está errada RFC 2616 menciona especificamente que If the content-coding of an entity in a request message is not acceptable to the origin server, the server SHOULD respond with a status code of 415 (Unsupported Media Type)., além disso, indicado por Request and Response messages MAY transfer an entity if not otherwise restricted by the request methode Content-Encodingser listado como uma opção naentity-header
PeterT