2003-12-12 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / Mono.Http / Mono.Http / GZipWebResponse.cs
1 //
2 // Mono.Http.GZipHttpWebResponse
3 //
4 // Authors:
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)
6 //
7 // (c) 2003 Ximian, Inc. (http://www.ximian.com)
8 //
9
10 using System;
11 using System.IO;
12 using System.Runtime.Serialization;
13 using ICSharpCode.SharpZipLib.GZip;
14
15 namespace System.Net 
16 {
17         [Serializable]
18         public class GZipWebResponse : WebResponse, ISerializable, IDisposable
19         {
20                 WebResponse response;
21                 bool compressed;
22                 [NonSerialized] Stream stream;
23                 [NonSerialized] long gzipLength;
24
25                 internal GZipWebResponse (WebResponse response, bool compressed)
26                 {
27                         this.response = response;
28                         this.compressed = compressed;
29                 }
30
31                 protected GZipWebResponse (SerializationInfo info, StreamingContext context)
32                 {
33                         response = (WebResponse) info.GetValue ("response", typeof (WebResponse));
34                         compressed = info.GetBoolean ("compressed");
35                 }
36                 
37                 public override long ContentLength {            
38                         get {
39                                 SetStream ();
40                                 if (compressed)
41                                         return gzipLength;
42
43                                 return response.ContentLength;
44                         }
45                 }
46                 
47                 public override string ContentType {
48                         get { return response.ContentType; }
49                 }
50                 
51                 public override WebHeaderCollection Headers {
52                         get { return response.Headers; }
53                 }
54                 
55                 public override Uri ResponseUri {               
56                         get { return response.ResponseUri; }
57                 }               
58                 
59                 public WebResponse RealResponse {
60                         get { return response; }
61                 }
62
63                 public bool IsCompressed {
64                         get { return compressed; }
65                 }
66
67                 public override Stream GetResponseStream ()
68                 {
69                         SetStream ();
70                         return stream;
71                 }
72                 
73                 void SetStream ()
74                 {
75                         lock (this) {
76                                 if (stream != null)
77                                         return;
78
79                                 Stream st = response.GetResponseStream ();
80                                 if (!compressed) {
81                                         stream = st;
82                                 } else {
83                                         stream = new GZipInputStream (st);
84                                         gzipLength = stream.Length;
85                                 }
86                         }
87                 }
88
89                 void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context)
90                 {
91                         info.AddValue ("response", response);
92                         info.AddValue ("compressed", compressed);
93                 }               
94
95                 public override void Close ()
96                 {
97                         ((IDisposable) this).Dispose ();
98                 }
99                 
100                 void IDisposable.Dispose ()
101                 {
102                         if (stream != null) {
103                                 stream.Close ();
104                                 stream = null;
105                         }
106
107                         if (response != null) {
108                                 response.Close ();
109                                 response = null;
110                         }
111                 }
112         }       
113 }
114