Как распаковать ответ сервера в формате 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); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д