GZip compression and changing UserAgent
Just in case you ever wanted to use the .NET Zip Library to receive GZip-compressed content from a webserver, as well as sending a custom UserAgent string to identify your app, here's how you do it:
/// <summary> /// Used to send out a custom application UserAgent, and return a string from a GZip-compressed /// response. /// </summary> /// <param name="strUrl">The url you want to retrieve.</param> /// <returns></returns> public string GetWebRequest(string strUrl) { StringBuilder mySB = new StringBuilder(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strUrl); // Sends the HttpWebRequest and waits for the response. request.UserAgent = "BSClient 0.3"; request.Headers.Add("Accept-Encoding", "gzip, deflate"); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Gets the stream associated with the response. Stream receiveStream = GetGzipStream(response); Encoding encode = System.Text.Encoding.GetEncoding("utf-8"); // Pipes the stream to a higher level stream reader with the required encoding format. StreamReader readStream = new StreamReader( receiveStream, encode ); Char[] read = new Char[256]; // Reads 256 characters at a time. int count = readStream.Read( read, 0, 256 ); while (count > 0) { // Dumps the 256 characters on a string and displays the string to the console. String str = new String(read, 0, count); mySB.Append(str); count = readStream.Read(read, 0, 256); } // Releases the resources of the response. response.Close(); // Releases the resources of the Stream. readStream.Close(); return mySB.ToString(); } /// <summary> /// Used in place of GetResponseStream(). This function will check out your HttpWebResponse's contents, /// and return the proper string representation of the HttpWebResponse stream. /// </summary> /// <param name="response"></param> /// <returns>String representation of the HttpWebResponse</returns> private Stream GetGzipStream(HttpWebResponse response) { Stream compressedStream = null; if (response.ContentEncoding=="gzip") { compressedStream = new GZipInputStream(response.GetResponseStream()); } else if (response.ContentEncoding=="deflate") { compressedStream = new InflaterInputStream(response.GetResponseStream()); } if (compressedStream != null) { MemoryStream decompressedStream = new MemoryStream(); int size = 2048; byte[] writeData = new byte[2048]; while (true) { size = compressedStream.Read(writeData, 0, size); if (size > 0) { decompressedStream.Write(writeData,0,size); } else { break; } } decompressedStream.Seek(0, SeekOrigin.Begin); return decompressedStream; } else { return response.GetResponseStream(); } }