I’m trying to get this piece of code working a little better. I suspect it’s the loop reading one byte at a time. I couldn’t find another way of doing this with gzip decompression. Implementing a StreamReader is fine, but it returns a string which I can’t pass to the decompression stream.
Is there a better way?
byte[] bufffer = null; List<byte> resourceBytes = new List<byte>(); int byteValue = 0; WebResource resource = new WebResource(); HttpWebResponse webResponse = null; try { HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(resourceUri); webRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, 'gzip,deflate'); webRequest.Headers.Add(HttpRequestHeader.AcceptCharset, 'ISO-8859-1,utf-8;q=0.7,*;q=0.7'); webRequest.UserAgent = agent; webRequest.Accept = 'text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1'; webRequest.Credentials = CredentialCache.DefaultCredentials; webRequest.Referer = resourceUri.OriginalString; webRequest.Timeout = 5000; webResponse = (HttpWebResponse)webRequest.GetResponse(); Stream webStream = webResponse.GetResponseStream(); if (!string.IsNullOrEmpty(webResponse.ContentEncoding)) { if (webResponse.ContentEncoding.ToLower().Contains('gzip')) { webStream = new GZipStream(webStream, CompressionMode.Decompress); } else if (webResponse.ContentEncoding.ToLower().Contains('deflate')) { webStream = new DeflateStream(webStream, CompressionMode.Decompress); } } do { byteValue = webStream.ReadByte(); if (byteValue != -1) { resourceBytes.Add((byte)byteValue); } } while (byteValue != -1); //Free up resources webStream.Close(); webResponse.Close(); bufffer = resourceBytes.ToArray();
I’d agree with jmcd that WebClient would be far simpler, in particular WebClient.DownloadData.
re the actual question, the problem is that you are reading single bytes, when you should probably have a fixed buffer, and loop – i.e.
[edit to add emphasis] The important bit is that you only process ‘bytesRead’ worth of data each time; everything beyond there is garbage.