2009-07-26 17 views
15

Ho una grande quantità di dati (~ 100k) che la mia app C# sta inviando al mio server Apache con mod_gzip installato. Sto provando a gzipare i dati usando System.IO.Compression.GZipStream. PHP riceve i dati grezzi con gzip, quindi Apache non lo decomprime come mi aspetterei. Mi sto perdendo qualcosa?Invio di dati gzippati in WebRequest?

System.Net.WebRequest req = WebRequest.Create(this.Url); 
req.Method = this.Method; // "post" 
req.Timeout = this.Timeout; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.Headers.Add("Content-Encoding: gzip"); 

System.IO.Stream reqStream = req.GetRequestStream(); 

GZipStream gz = new GZipStream(reqStream, CompressionMode.Compress); 

System.IO.StreamWriter sw = new System.IO.StreamWriter(gz, Encoding.ASCII); 
sw.Write(large_amount_of_data); 
sw.Close(); 

gz.Close(); 
reqStream.Close() 


System.Net.WebResponse resp = req.GetResponse(); 
// (handle response...) 

Non sono del tutto sicuro che "Content-Encoding: gzip" si applica alle intestazioni fornite dal client.

+6

+1 per la pubblicazione di codice che comprime i dati pubblicati. Credo che tu sia l'unico ad averlo fatto nell'era di Internet ;-) –

+0

Mi piacerebbe sapere se una delle idee qui sotto ti ha aiutato - sto cercando di risolvere lo stesso problema. –

risposta

1

Secondo http://www.dominoexperts.com/articles/GZip-servlet-to-gzip-your-pages

Si dovrebbe setContentType() per il formato originale, come si sta facendo con l'application/x-www-form-urlencoded suppongo. Poi ...

// See if browser can handle gzip 
String encoding=req.getHeader("Accept-Encoding"); 
if (encoding != null && encoding.indexOf("gzip") >=0) { // gzip browser 
     res.setHeader("Content-Encoding","gzip"); 
     OutputStream o=res.getOutputStream(); 
     GZIPOutputStream gz=new GZIPOutputStream(o); 
     gz.write(content.getBytes()); 
     gz.close(); 
     o.close(); 
      } else { // Some old browser -> give them plain text.      PrintWriter o = res.getWriter(); 
        o.println(content); 
        o.flush(); 
        o.close(); 
      } 
4

ho guardato il codice sorgente per mod_gzip e non ho trovato alcun codice che decomprime i dati. Apparentemente mod_gzip comprime solo i dati in uscita che non sono poi così sorprendenti. La funzionalità che stai cercando è probabilmente usata raramente, e temo che tu debba fare la tua decompressione sul server.

4

quanto riguarda la tua questione se Content-Encoding è applicabile alle intestazioni fornite dal client - secondo HTTP/1.1 standard, è:

(dalla sezione 7)

Request e Response messaggi possono trasferire un'entità se non altrimenti limitato dal metodo di richiesta o dal codice di stato della risposta.

(dalla sezione 7,1)

entity-header = Allow     ; Section 14.7 
        | Content-Encoding   ; Section 14.11 
        | Content-Language   ; Section 14.12 
        | Content-Length   ; Section 14.13 
        | Content-Location   ; Section 14.14 
        | Content-MD5    ; Section 14.15 
        | Content-Range   ; Section 14.16 
        | Content-Type    ; Section 14.17 
        | Expires     ; Section 14.21 
        | Last-Modified   ; Section 14.29 
        | extension-header 
+5

Questo è vero, con l'avvertenza che la maggior parte dei server non eseguirà la decompressione delle richieste HTTP, a causa della possibilità dei cosiddetti attacchi "Zip Bomb". – EricLaw

2

è necessario modificare

req.Headers.Add("Content-Encoding: gzip"); 

a

req.Headers.Add("Content-Encoding","gzip"); 
0

Sulla PHP lato questo eliminerà intestazione e piè da file

function gzip_stream_uncompress($data) { return gzinflate(substr($data, 10, -8)); }