gzip C#/.NET GZipHttpWebResponse.cs
The GZipHttpWebResponse.cs file does response processing. To see the GZipHttpWebResponse.cs file un-annotated, click here.
Reference the needed namespaces. |
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 |
Specify the namespace for this class. |
using ICSharpCode.SharpZipLib.GZip; |
|
|
namespace Galileo.Web |
|
|
{ |
|
/// <summary> |
|
/// HttpWebResponse 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] |
Constructor. Take what we need from the response parameter, decompressing the response stream if it is compressed. |
public class GZipHttpWebResponse : WebResponse |
|
{ |
Declare member variables. |
private Stream m_decompressedStream; |
private string _contentType; |
|
private long _contentLength; |
|
private string _contentEncoding; |
|
private Uri _responseUri; |
|
private WebHeaderCollection _httpResponseHeaders; |
|
|
|
|
///// <summary> |
|
///// default constructor from WebResponse |
|
///// </summary> |
|
///// <param name="serializationInfo"></param> |
|
///// <param name="streamingContext"></param> |
|
//protected GZipHttpWebResponse( |
|
//SerializationInfo serializationInfo, |
|
//StreamingContext streamingContext |
|
//) : base (serializationInfo, streamingContext) |
|
//{ |
|
//} |
|
// |
Override base class behavior to use our member variables for these properties. |
public override long ContentLength |
{ |
|
set |
|
{ |
|
_contentLength = value; |
|
} |
|
|
|
get |
|
{ |
|
return _contentLength; |
|
} |
|
} |
|
|
|
|
|
public override string ContentType |
|
{ |
|
set |
|
{ |
|
_contentType = value; |
|
} |
|
|
|
get |
|
{ |
|
return _contentType; |
|
} |
|
} |
|
|
|
public override WebHeaderCollection Headers |
|
{ |
|
get |
|
{ |
|
return _httpResponseHeaders; |
|
} |
|
} |
|
|
|
public string ContentEncoding |
|
{ |
|
set |
|
{ |
|
_contentEncoding = value;; |
|
} |
|
|
|
get |
|
{ |
|
return _contentEncoding; |
|
} |
|
} |
|
|
|
|
public GZipHttpWebResponse(HttpWebResponse response) |
|
{ |
|
try |
|
{ |
Initialize our members variables from the HttpWebResponse object. |
_contentType = response.ContentType; |
_contentLength = response.ContentLength; |
|
_contentEncoding = response.ContentEncoding; |
|
_responseUri = response.ResponseUri; |
|
_httpResponseHeaders = response.Headers; |
|
If the response is compressed, then decompress it into a memory stream. |
if (_contentEncoding=="gzip") |
{ |
|
// Decompress response stream with GZip |
|
const int BUF_SIZE = 16384; |
|
Stream compressedStream = new GZipInputStream(response.GetResponseStream(), BUF_SIZE); |
|
m_decompressedStream = new MemoryStream(); |
|
|
|
byte[] writeData = new byte[BUF_SIZE]; |
|
int size = compressedStream.Read(writeData, 0, BUF_SIZE); |
|
while (size > 0) |
|
{ |
|
m_decompressedStream.Write(writeData, 0, size); |
|
size = compressedStream.Read(writeData, 0, BUF_SIZE); |
|
} |
|
m_decompressedStream.Seek(0, SeekOrigin.Begin); |
|
_contentEncoding = ""; |
|
_httpResponseHeaders.Remove("Content-Encoding"); |
|
_contentLength = m_decompressedStream.Length; |
|
// We have decompressed the entire response, so we no longer need the compressed version. |
|
response.Close(); |
|
} |
|
If the response is not compressed, just... |
else |
{ |
|
...return the response stream from the HttpWebResponse object. |
m_decompressedStream = response.GetResponseStream(); |
} |
|
|
} |
If an exception occurs, clean up the resources we are using and re-throw the exception. |
catch(Exception) |
{ |
|
// We got an exception processing the response. Clean up. |
|
response.Close(); |
|
Close(); |
|
throw; |
|
|
} |
|
} |
|
|
Make sure to close the decompressed stream when the object is deleted. |
~GZipHttpWebResponse() |
{ |
|
Close(); |
|
} |
|
|
|
Return the stream referenced by our local member variable. |
public override Stream GetResponseStream() |
{ |
|
return m_decompressedStream; |
|
|
} |
|
|
|
public override void Close() |
|
{ |
If our member variable is pointing to a stream, close it. |
if(m_decompressedStream != null) |
{ |
|
m_decompressedStream.Close(); |
|
m_decompressedStream = null; |
|
} |
|
} |
|
|
|
Override base class behavior to use our member variables for these properties. |
public override Uri ResponseUri { get { return _responseUri; } } |
|
} |
|
} |
|
|