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>
/// 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]
public class GZipHttpWebResponse : WebResponse
{
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)
// {
// }
//
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
{
_contentType = response.ContentType;
_contentLength = response.ContentLength;
_contentEncoding = response.ContentEncoding;
_responseUri = response.ResponseUri;
_httpResponseHeaders = response.Headers;
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();
}
else
{
m_decompressedStream = response.GetResponseStream();
}
}
catch(Exception)
{
// We got an exception processing the response. Clean up.
response.Close();
Close();
throw;
}
}
~GZipHttpWebResponse()
{
Close();
}
public override Stream GetResponseStream()
{
return m_decompressedStream;
}
public override void Close()
{
if(m_decompressedStream != null)
{
m_decompressedStream.Close();
m_decompressedStream = null;
}
}
public override Uri ResponseUri { get { return _responseUri; } }
}
}