Как распаковать ответ сервера в формате Gzip? - C#
Формулировка задачи:
Добрый день. У меня проблема при попытке разархивировать ответ от одного сайта, сжатый с помощью gzip.
Вот мой метод:
В цикле происходит поиск строки "\r\n\r\n" и отсечение верхней части, это заголовки ответа сервера. А то что ниже остается - это само тело страницы сжатое в gzip. И вот с этим проблема, метод myGzip.Read выдает исключение при попытке прочитать в буфер данные:
System.IO.InvalidDataException: Неправильное магическое число в заголовке GZip. Передача должна идти в поток GZip.
Собственно не могу найти что это за число и почему возникает тут эта ошибка, так как данные приходят в запакованном виде, это видно через fiddler.
string Ungzip(MemoryStream m1)
{
string page = "";
Encoding enc = Encoding.UTF8;
byte[] bytesReceived = m1.ToArray();
try
{
for (int i = 0; i < bytesReceived.Length; i++)
{
if (bytesReceived[i] == 13 &&
bytesReceived[i + 1] == 10 &&
bytesReceived[i + 2] == 13 &&
bytesReceived[i + 3] == 10)
{
var b = bytesReceived.Take(i).ToArray();
page = enc.GetString(b, 0, b.Length);
bytesReceived = bytesReceived.Skip(i+4).ToArray();
break;
}
}
GZipStream myGzip = new GZipStream(new MemoryStream(bytesReceived), CompressionMode.Decompress);
using (MemoryStream m = new MemoryStream())
{
byte[] buffer = new byte[1000];
int len = 0;
while ((len = myGzip.Read(buffer, 0, buffer.Length)) > 0)
{
m.Write(buffer, 0, len);
}
bytesReceived = m.ToArray();
}
page += enc.GetString(bytesReceived, 0, bytesReceived.Length);
}
catch {}
return page;
}Решение задачи: «Как распаковать ответ сервера в формате Gzip?»
textual
Листинг программы
using (s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
s.Connect(host, 80);
parametres = "some post params";
byte[] ByteArr = Encoding.UTF8.GetBytes(parametres);
requestS =
"POST http://" + host + " HTTP/1.1\r\n" +
"Host: " + host +
"\r\nConnection: close\r\n" +
"User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:37.0) Gecko/20100101 Firefox/37.0\r\n" +
"Accept-Encoding: gzip, deflate\r\n" +
"Content-Length: " + ByteArr.Length +
"\r\nContent-Type: application/x-www-form-urlencoded\r\n\r\n" +
parametres;
Byte[] bytesSent = Encoding.UTF8.GetBytes(requestS);
Byte[] bytesReceived = new Byte[1000];
s.Send(bytesSent, bytesSent.Length, 0);
int bytes = 0;
page = "";
using (MemoryStream m = new MemoryStream())
{
do
{
bytes = s.Receive(bytesReceived, bytesReceived.Length, 0);
m.Write(bytesReceived, 0, bytes);
}
while (bytes > 0);
page = Ungzip(m);
}
}