gzip C#/.NET GZipHttpWebRequest.cs

using System;

using System.Web;

using System.IO;

using System.Net;

using System.Runtime.Serialization;

using System.Xml;

 

// #ZipLib was developed by Mike Krueger, and is available under the GNU Public License at:

//          http://www.icsharpcode.net/OpenSource/SharpZipLib/Default.aspx

using ICSharpCode.SharpZipLib.GZip;

 

namespace Galileo.Web

{

      /// <summary>

      /// HttpWebRequest with gzip decompression

      /// The source for this class is based on this article on dotnetjunkies.com:

      ///         http://www.dotnetjunkies.com/Tutorial/46630AE2-1C79-4D5F-827E-6C2857FF1D23.dcik

      /// </summary>

      [Serializable]

      public class GZipHttpWebRequest : WebRequest

      {

            private HttpWebRequest request;

            

            public GZipHttpWebRequest(Uri uri)

            {

                  this.request = (HttpWebRequest)HttpWebRequest.Create(uri);

            }

 

            public override Stream GetRequestStream()

            {

                  if (request.Headers["Content-Encoding"]=="gzip")

                  {

                        // Compress request stream with GZip

                        Stream compressedStream = new GZipOutputStream(request.GetRequestStream());

                        return compressedStream;

                  }

                  else

                  {

                        return request.GetRequestStream();

                  }

            }

 

            public bool KeepAlive { get { return request.KeepAlive; } set { request.KeepAlive = value; } }

            public Version ProtocolVersion { get { return request.ProtocolVersion; } set { request.ProtocolVersion = value; } }

 

            // encapsulated WebRequest methods and properties

            public override void Abort()

            {

                  request.Abort();

            }

 

            public override IAsyncResult BeginGetRequestStream(AsyncCallback callback, object state)

            {

                  return request.BeginGetRequestStream(callback, state);

            }

 

            public override IAsyncResult BeginGetResponse(AsyncCallback callback, object state)

            {

                  return request.BeginGetResponse(callback, state);

            }

 

            public override Stream EndGetRequestStream(IAsyncResult asyncResult)

            {

                  if (request.Headers["Content-Encoding"]=="gzip")

                  {

                        // Compress request stream with GZip

                        Stream compressedStream = new GZipOutputStream(request.EndGetRequestStream(asyncResult));

                        return compressedStream;

                  }

                  else

                  {

                        return request.EndGetRequestStream(asyncResult);

                  }

            }

 

            public override WebResponse EndGetResponse(IAsyncResult asyncResult)

            {

                  return request.EndGetResponse(asyncResult);

            }

 

            public override WebResponse GetResponse()

            {

                  return request.GetResponse();

            }

 

            public override string ConnectionGroupName { get { return request.ConnectionGroupName; } set { request.ConnectionGroupName = value; } }

            public override long ContentLength { get { return request.ContentLength; } set { request.ContentLength = value; } }

            public override string ContentType { get { return request.ContentType; } set { request.ContentType = value; } }

            public override ICredentials Credentials { get { return request.Credentials; } set { request.Credentials = value; } }

            public override WebHeaderCollection Headers { get { return request.Headers; } set { request.Headers = value; } }

            public override string Method { get { return request.Method; } set { request.Method = value; } }

            public override bool PreAuthenticate { get { return request.PreAuthenticate; } set { request.PreAuthenticate = value; } }

            public override IWebProxy Proxy { get { return request.Proxy; } set { request.Proxy = value; } }

            public override Uri RequestUri { get { return request.RequestUri; } }

            public override int Timeout { get { return request.Timeout; } set { request.Timeout = value; } }

      }

}