È possibile abilitare la compressione http per le richieste?


35

Vedo molte informazioni sull'abilitazione della compressione http per le risposte del server, ma per le richieste in arrivo. Non avrebbe senso per i browser comprimere i post di grandi dimensioni prima di inviarli al server?

Un altro esempio è un servizio Web REST che utilizziamo. Dobbiamo inviare frequenti richieste PUT con file XML di grandi dimensioni (10+ MB) e vedremo sicuramente alcuni vantaggi di larghezza di banda / velocità su entrambi i lati.

Quindi questo è un problema risolto sul lato server o ogni applicazione Web deve gestirlo singolarmente?

Risposte:


30

Per i PUTdati al server compresso è necessario comprimere il corpo della richiesta e impostare l' Content-Encoding: gzipintestazione. L'intestazione stessa deve essere non compressa. È documentato in mod_deflate :

Il modulo mod_deflate fornisce anche un filtro per decomprimere un corpo di richiesta compresso gzip. Per attivare questa funzione è necessario inserire il filtro DEFLATE nella catena del filtro di input utilizzando SetInputFilter o AddInputFilter.

...

Ora se una richiesta contiene un'intestazione Content-Encoding: gzip, il corpo verrà automaticamente decompresso. Pochi browser hanno la capacità di decomprimere i corpi delle richieste. Tuttavia, alcune applicazioni speciali in realtà supportano la compressione delle richieste, ad esempio alcuni client WebDAV.

E un articolo che lo descrive è qui :

Quindi come lo fai? Ecco un errore, sempre dal codice sorgente mod_deflate: funziona solo su richiesta principale / nessuna richiesta secondaria. Ciò significa che l'intero corpo della richiesta deve essere compresso con gzip se abbiamo scelto di usarlo, non è possibile comprimere solo la parte che contiene il file, ad esempio in una richiesta multipart.

Separatamente, un browser può richiedere la compressione del contenuto della risposta del server impostando l' Accept-Encodingintestazione come qui :

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

Ciò restituirà i dati compressi al browser.


5
+1 NB Scrivi you must compress the whole request, inclusive of header. Tuttavia, le intestazioni http non devono essere compresse . L'unica cosa che deve essere compressa (per intero, come l'articolo correttamente citato), è il corpo http.
Eugene Beresovsky,

1
Questo è sbagliato: Accept-Encodingindica al server quale compressione supporta il client. L'intestazione Content-Encodingdescrive la compressione del corpo.
maaartino

@maaartinus vedi prima citazione secondo paragrafo. Ho riorganizzato la risposta per chiarezza.
Andy,

4

Rispondere alla parte relativa alle richieste compresse, non alle risposte: sì, è possibile, anche se non sembra in uso diffuso. L'app sul lato client deve impostare l'intestazione di codifica del contenuto appropriata. Per quanto riguarda l'app lato server, ci sono 2 opzioni:

  1. l'app supporta da sola la reinflazione del corpo della richiesta. Una libreria di esempio che può farlo è quella phpxmlrpc.

  2. il server web gonfia il corpo della risposta prima di passarlo all'app. Questo è possibile usando il filtro mod_deflate di Apache e impostando un inputFilter


2

Non nativamente da qualsiasi browser che conosco, dovresti trovare un plugin che lo farebbe per te. Fondamentalmente devi impostare l'intestazione HTTP di codifica del contenuto per far sapere al server come arriva la richiesta. Il server, ovviamente, deve essere in grado di gestire quella codifica.


0

Questo NON è permesso. Secondo la specifica HTTP ( RFC 2616 ), Content-EncodingNON è uno dei possibili campi di intestazione della richiesta, pertanto non è possibile comprimere il corpo dell'entità richiesta in quanto non esiste un modo legale per far sapere al server che si è verificato. Qualsiasi compressione del corpo della richiesta viene eseguita solo come estensione non standard.


12
Questa risposta è errata. RFC 2616 menziona specificamente che è 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).inoltre indicato Request and Response messages MAY transfer an entity if not otherwise restricted by the request methoded Content-Encodingelencato come opzione inentity-header
PeterT
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.