2009-07-26 25 views
15

Mam dużą ilość danych (~ 100k), które moja aplikacja C# wysyła do mojego serwera Apache z zainstalowanym mod_gzip. Próbuję najpierw gzip danych przy użyciu System.IO.Compression.GZipStream. PHP odbiera surowe spakowane dane, więc Apache nie dekompresuje go tak, jak się spodziewałam. Czy czegoś brakuje?Wysyłanie gzipowanych danych w 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...) 

Nie jestem do końca pewien, czy "Content-Encoding: gzip" dotyczy nagłówków dostarczanych przez klienta.

+6

+1 do kodu, który kompresuje dane zamieszczone delegowania. Wierzę, że jesteś jedyną osobą, która zrobiła to w erze Internetu ;-) –

+0

Chciałbym usłyszeć, jeśli któryś z poniższych pomysłów pomógł ci - próbuję rozwiązać ten sam problem. –

Odpowiedz

1

Według http://www.dominoexperts.com/articles/GZip-servlet-to-gzip-your-pages

Należy setContentType() do pierwotnej formy, jak robisz z application/x-www-form-urlencoded zakładam. Potem ...

// 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

Spojrzałem na kodzie źródłowym dla mod_gzip i nie mogłem znaleźć żadnego kodu, który dekompresji danych. Najwyraźniej mod_gzip kompresuje tylko dane wychodzące, co wcale nie jest zaskakujące. Funkcjonalność, której szukasz, jest prawdopodobnie rzadko używana i obawiam się, że musisz wykonać własną dekompresję na serwerze.

4

Odnośnie twojego pytania, czy Content-Encoding jest zastosowanie nagłówków klienta dostarczane - według HTTP/1.1 standard, to jest:

(od odcinka 7)

komunikaty żądania i odpowiedzi może przenieść się podmiotu, jeżeli w inny sposób ograniczone przez metodę żądania lub kod statusu odpowiedzi.

(z sekcji 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

Jest to prawdą, z zastrzeżeniem, że większość serwerów nie wykona dekompresji żądań HTTP, z powodu możliwości tak zwanych ataków "Zip Bomb". – EricLaw

2

Musisz zmienić

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

do

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

Na PHP strona ta będzie rozebrać się nagłówek i stopkę z pliku

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

Powiązane problemy