所以,我正在尝试制作一个程序,将计算机变成一个代理 使用这个。一切都很顺利,除了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):从此处复制答案后,我已经成功地解压缩了正文。
新问题:Firefox。
![error](https://istack.dev59.com/vIR2R.webp)
现在我不确定是否需要解压缩gzip页面。
我现在做错了什么?
MemoryStream
:Seek(0, SeekOrigin.Begin)
是多余的。 - Max Yakimets