2010-02-06 11 views
0

J'ai un code écrit par moi en C#GZipStream, comment lire correctement à partir GZipStream

 string host = new Uri(_url).Host; 
     IPHostEntry ipAddress = Dns.GetHostEntry(host); 
     IPEndPoint ip = new IPEndPoint(ipAddress.AddressList[0], 80); 
     using (Socket s = new Socket(ip.AddressFamily, SocketType.Stream, ProtocolType.Tcp)) 
     { 
      s.Connect(ip); 
      using (NetworkStream n = new NetworkStream(s)) 
      { 
        byte[] write = encoding.GetBytes(HttpQuery); 
        n.Write(write, 0, write.Length); 
        ReadLine(n); 
        Dictionary<string, string> headers = new Dictionary<string, string>(); 
        while (true) 
        { 
         string line = ReadLine(n); 
         if (line.Length == 0) 
         { 
          break; 
         } 
         int index = line.IndexOf(':'); 
         if (!headers.ContainsKey(line.Substring(0, index))) 
         { 
          headers.Add(line.Substring(0, index), line.Substring(index + 2)); 
         } 
        } 

        string contentEncoding; 
        if (headers.TryGetValue("Content-Encoding", out contentEncoding)) 
        { 
         Stream responseStream = n; 
         if (contentEncoding.Equals("gzip")) 
         { 
          responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
          responseStream.Flush(); 
         } 
         else if (contentEncoding.Equals("deflate")) 
         { 
          responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
         } 

         MemoryStream memStream = new MemoryStream(); 

         byte[] respBuffer = new byte[4096]; 
         try 
         { 
          int bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length); 
          //int bytesRead = responseStream.ReadByte(); 
          while (bytesRead > 0) 
          { 
           memStream.Write(respBuffer, 0, bytesRead); 
           bytesRead = responseStream.Read(respBuffer, 0, respBuffer.Length); 
          } 
         } 
         finally 
         { 
          responseStream.Close(); 
         } 
         string str = encoding.GetString(memStream.ToArray()); 

Puis-je avoir un InvalidDataException d'exception dans cette ligne int bytesRead = responseStream.Read (respBuffer, 0, respBuffer.Length)

Le numéro magique d'en-tête GZip est incorrect.

string ReadLine(Stream stream) 
    { 
     List<byte> lineBuffer = new List<byte>(); 
     try 
     { 
      while (true) 
      { 
       int b = stream.ReadByte(); 
       if (b == -1) 
        return null; 
       if (b == 10) 
        break; 
       if (b != 13) 
        lineBuffer.Add((byte) b); 
      } 
     } 
     catch (Exception) 
     { 
     } 
     return encoding.GetString(lineBuffer.ToArray()); 
    } 

Des idées?

+2

Évitez d'inventer la roue, la classe HttpWebResponse le fait déjà. –

Répondre

0

Votre fonction ReadLine retourne dès qu'elle lit un caractère de saut de ligne lors de la lecture d'une ligne vide. Cela ne laisse-t-il pas potentiellement le flux positionné à un caractère de retour chariot au lieu de au début du flux de données GZip?

0

en général, je trouve quelque chose sur le sujet, voici ce lien Sockets in C#: How to get the response stream?, il y a des informations qui avant la chaîne (s) de le faire:

     Stream responseStream = n; 
         int magicNumber = 0; 
         while (magicNumber != 10) 
         { 
          magicNumber = responseStream.ReadByte(); 
         } 
         if (contentEncoding.Equals("gzip")) 
         { 
          responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
         } 

peut-être je ne pas tout à fait le faire correctement?

nobugz J'ai code très succeful writen avec WttWebRequest et HttpWebResponse, MAIS ma page ont codepape-1251, et HttpWebRequest convertir url de 1251 encodage UTF-8 I et rien ne peut le faire avec cela, peut-être vous avoir des idées?

Par exemple, j'ai url comme http://myurl.php?name=Мастер%20Создатель

HttpWebRequest convertir cela en http://myurl.php?name=%d0%9c%d0%b0%d1%81%d1%82%d0%b5%d1%80+%d0%a1%d0%be%d0%b7%d0%b4%d0%b0%d1%82%d0%b5%d0%bb%d1%8c (UTF-8)

, mais sera http://myurl.php?name=%CC%E0%F1%F2%E5%F0%20%D1%EE%E7%E4%E0%F2%E5%EB%FC (windows-1251), je ne » t savoir comment résoudre ce problème

+0

Pourquoi le codage de l'URL est-il un problème? Vous essayez de traiter le contenu gzip dans la réponse, pas l'URL, n'est-ce pas? Est-ce que cette question est liée à votre question originale? – BlueMonkMN