Как распаковать ответ сервера в формате Gzip? - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. У меня проблема при попытке разархивировать ответ от одного сайта, сжатый с помощью gzip. Вот мой метод:
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;
        }
В цикле происходит поиск строки "\r\n\r\n" и отсечение верхней части, это заголовки ответа сервера. А то что ниже остается - это само тело страницы сжатое в gzip. И вот с этим проблема, метод myGzip.Read выдает исключение при попытке прочитать в буфер данные: System.IO.InvalidDataException: Неправильное магическое число в заголовке GZip. Передача должна идти в поток GZip. Собственно не могу найти что это за число и почему возникает тут эта ошибка, так как данные приходят в запакованном виде, это видно через fiddler.

Решение задачи: «Как распаковать ответ сервера в формате 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);
                                    }
                                }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.556 из 5
Похожие ответы