2014-01-25 76 views
3

所以,我試圖製作一個程序,將電腦變成代理using this。除了gzip/deflate頁面,它一切正常。C# - GZipStream幻數不正確?

每當我嘗試解壓時,都會得到一個InvalidDataException,指出GzipHeader中的幻數不正確。

我用這個函數:

private byte[] GZipUncompress(byte[] data) 
{ 
    using (var input = new MemoryStream(data)) 
    { 
     input.Seek(0, SeekOrigin.Begin); 

     using (var gzip = new GZipStream(input, CompressionMode.Decompress)) 
     using (var output = new MemoryStream()) 
     { 
      output.Seek(0, SeekOrigin.Begin); 
      gzip.CopyTo(output); 

      return output.ToArray(); 
     } 
    } 
} 

解壓縮數據。錯誤:

error http://gyazo.com/c59de705a264cda47d670ae9b03dfa39.png

任何幫助,將不勝感激。

編輯:我似乎已經得到了一個地方!

正如usr建議,我應該編寫一個HTTP解析器來獲取正文並解壓。

前解析:http://pastebin.com/Cb0E8WtT

解析後:​​

這是我使用去身體的方法:

private byte[] HTTParse(byte[] data) 
    { 
     string http = ascii.GetString(data); 
     char[] lineBreak = crlf.ToCharArray(); 
     string[] parts = http.Split(lineBreak); 

     List<byte> res = new List<byte>(); 

     for (int i = 1; i < parts.Length; i++) 
     { 
      if (i % 2 == 0) 
      { 
       Regex r = new Regex(@"(.)*: (.)*"); 
       Regex htt = new Regex(@"HTT(.)*/(.)*.(.)* d{1,50} (.)*"); 
       if (!r.IsMatch(parts[i]) && !htt.IsMatch(parts[i])) 
       { 
        //Console.WriteLine("[TEST] " + parts[i]); 
        res.AddRange(ascii.GetBytes(parts[i])); 
        res.AddRange(ascii.GetBytes("\r\n")); 
       } 

      } 
     } 
     return res.ToArray(); 
    } 

但是,我仍然得到一個錯誤說「魔GZip頭部中的數字不正確,請確保您傳入的是GZip流。「編輯(2):從here複製一個答案後,我設法成功解壓身體。

新問題:Firefox。

error http://gyazo.com/7c40af607471fbdd3c4968af547004b6.png

現在我不確定是否我甚至需要解壓縮的gzip頁面..

我在哪裏錯了現在沒有了?

+1

可能數據不會被解壓縮。看看字節。他們看起來怎麼樣。 – usr

+0

作爲一個方面說明:你不需要「倒帶」一個新鮮的'MemoryStream':'Seek(0,SeekOrigin.Begin)'是多餘的 –

+0

@usr:http:// pastebin。com/Cb0E8WtT這是whatismyip.org的請求,它看起來像我需要從頭中分離響應。任何想法我可以做到這一點? –

回答

2

你說過,你使用這段代碼進行gzip/deflate。但是deflate與gzip並不相同,特別是它沒有像gzip這樣的魔術標題。 RFC1951中定義了Deflate,RC1952中的gzip。此外,根據RFC1950,Firefox和Chrome(但不包括Internet Explorer)等瀏覽器也接受「原始縮減」。 因此,在將解壓縮應用到正文之前,您必須首先根據「Content-Encoding」標題檢查使用了哪種壓縮。

1

事實證明,我甚至從來都不需要解壓縮壓縮的數據。

然而,按照解決方案:

我分開身上帶的this的幫助,並試圖將之解壓到。我沒有意識到的是,我發送了大約500個空白字節,這產生了一個錯誤的請求(使用壓縮數據中的html),所以我無法解壓縮。