【发布时间】:2014-01-25 09:39:33
【问题描述】:
所以,我正在尝试制作一个将计算机变成代理 using this 的程序。除了 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):从here 复制答案后,我成功解压缩了正文。
新问题:Firefox。
(来源:gyazo.com)
我现在不确定是否需要解压缩 gzip 页面..
我现在哪里出错了?
【问题讨论】:
-
可能是数据没有被gzip压缩。查看字节。它们长什么样。
-
附带说明:你不需要“倒带”一个新的
MemoryStream:Seek(0, SeekOrigin.Begin)是多余的 -
@usr:pastebin.com/Cb0E8WtT 这是 whatismyip.org 的请求,看来我需要将响应与标头分开。有什么想法我该怎么做?
-
使用标准 HTTP 库下载响应。使用自动解压。
-
@usr:我想保持这种方式,因为它可以更容易实现 SOCKS。
标签: c# sockets gzipstream deflatestream