我有一个处理 HTTP 请求的代理。
现在,当我收到 GZipped HTTP 响应时,我正在解压缩它:
MemoryStream ms = new MemoryStream();
if (response.ContentLength > 0)
buffer = new Byte[response.ContentLength];
else
buffer = new Byte[BUFFER_SIZE];
int bytesRead;
while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, bytesRead);
}
string resp = "";
if (response.ContentEncoding == "gzip")
resp = Utilities.GZip.Unzip(ms.ToArray());
else
resp = Encoding.UTF8.GetString(ms.ToArray());
Utilities.GZip.Unzip 的作用是:
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(msi, CompressionMode.Decompress))
{
CopyTo(gs, mso);
}
return Encoding.UTF8.GetString(mso.ToArray());
}
到目前为止一切都很好,我可以阅读 HTML。
现在我必须将响应写回请求它的客户。
像这样:
byte[] outByte;
if (response.ContentEncoding == "gzip")
outByte = Utilities.GZip.Zip(resp);
else
outByte = Encoding.UTF8.GetBytes(resp);
outStream.Write(outByte, 0, outByte.Length);
Utilities.GZip.Zip 在哪里:
var bytes = Encoding.UTF8.GetBytes(str);
using (var msi = new MemoryStream(bytes))
using (var mso = new MemoryStream())
{
using (var gs = new GZipStream(mso, CompressionMode.Compress))
{
CopyTo(msi, gs);
}
return mso.ToArray();
}
现在这是一个非常奇怪的行为,响应字节数组的长度为 16990(压缩),但我自己的压缩字节数组的长度为 19379。
客户端得到响应,但被切断了。
有什么建议么?
编辑:
供您参考,因为我将原始的 MemoryStream 原封不动地发送给客户端,一切都很好!