3

所以,我正在尝试制作一个程序,使用这个将计算机变成代理。除了 gzip/deflate 页面外,这一切都很好。

每当我尝试解压缩时,我都会收到一个 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();
        }
    }
}

解压缩数据。错误:

错误
(来源:gyazo.com

任何帮助,将不胜感激。

编辑:我似乎已经到了某个地方!

正如 usr 建议的那样,我应该编写一个 HTTP 解析器来获取正文并解压缩它。

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

解析后:http: //pastebin.com/k9e8wMvr

这是我用来到达身体的方法:

    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):从这里复制答案后,我成功地解压缩了身​​体。

新问题:火狐。

错误
(来源:gyazo.com

我现在不确定我是否需要解压缩 gzip 页面..

我现在哪里出错了?

4

2 回答 2

3

您说过,您将此代码用于 gzip/deflate。但是 deflate 与 gzip 不同,尤其是它没有像 gzip 那样的魔术头。Deflate 在 RFC1951 中定义,gzip 在 RC1952 中定义。此外,Firefox 和 Chrome(但不包括 Internet Explorer)等浏览器也接受 RFC1950 规定的“原始放气”。因此,在对正文应用解压缩之前,您必须首先根据“Content-Encoding”标头检查使用了哪种压缩。

于 2014-01-25T12:16:58.797 回答
1

事实证明,我什至不需要解压缩压缩数据。

但是,根据解决方案:

我在this的帮助下分离了身体,并试图解压缩它。我没有意识到我发送了大约 500 个空白字节,这产生了一个错误的请求(压缩数据中有 html),所以我无论如何都无法解压缩。

于 2014-01-26T12:13:18.297 回答