2 // System.Web.HttpWriter
5 // Patrik Torstensson (Patrik.Torstensson@labs2.com)
10 using System.Web.Util;
14 public sealed class HttpWriter : TextWriter
16 HttpResponse _Response;
18 HttpResponseStream _ResponseStream;
20 MemoryStream _OutputStream;
21 StreamWriter _OutputHelper;
26 HttpResponseStreamProxy _OutputProxy;
28 internal HttpWriter (HttpResponse Response)
32 _OutputStream = new MemoryStream (32768);
33 _OutputHelper = new StreamWriter (_OutputStream, WebEncoding.Encoding);
34 _ResponseStream = new HttpResponseStream (this);
39 internal void Dispose ()
41 _OutputHelper.Close ();
42 _OutputStream.Close ();
43 _OutputFilter.Close ();
46 internal Stream GetActiveFilter ()
48 if (null == _OutputFilter) {
49 // Create a filter proxy to allow us to know if we have a valid filter
50 if (null == _OutputProxy)
51 _OutputProxy = new HttpResponseStreamProxy (this);
58 internal void ActivateFilter (Stream OutputFilter)
60 if (null == _OutputProxy)
61 throw new HttpException ("Invalid filter usage");
63 _OutputFilter = OutputFilter;
66 internal void FilterData (bool CloseStream)
68 // Check if we have any filter at all
69 if (null == _OutputFilter)
74 // Save our current data
75 byte [] arrData = _OutputStream.GetBuffer ();
76 int size = (int) _OutputStream.Length;
78 // Remove our internal data
81 // If we have a filter then we have a proxy
82 _OutputProxy.Active = true;
85 // Call the filter (it does a callback into our HttpWriter again)
86 _OutputFilter.Write (arrData, 0, size);
87 _OutputFilter.Flush ();
90 _OutputFilter.Close ();
92 _OutputProxy.Active = false;
96 internal void Clear ()
98 _OutputHelper.Close ();
99 _OutputStream.Close ();
101 // Quick way of doing cleanup
102 _OutputStream = new MemoryStream (32768);
103 _OutputHelper = new StreamWriter (_OutputStream, WebEncoding.Encoding);
106 internal void SendContent (HttpWorkerRequest Handler)
110 int l = (int)_OutputStream.Length;
112 byte [] arrContent = _OutputStream.GetBuffer ();
113 Handler.SendResponseFromMemory (arrContent, l);
117 internal void Update ()
119 _Encoder = _Response.ContentEncoder;
120 _Encoding = _Response.ContentEncoding;
123 internal long BufferSize
127 return _OutputStream.Length;
131 internal void FlushBuffers ()
133 _OutputHelper.Flush ();
134 _OutputStream.Flush ();
137 public override Encoding Encoding
139 get { return _Encoding; }
142 public Stream OutputStream
144 get { return _ResponseStream; }
147 public override void Close ()
154 public override void Flush ()
158 private void CheckIfFlush ()
160 if (!_Response.BufferOutput) {
166 public override void Write (char ch)
168 _OutputHelper.Write (ch);
172 public override void Write (object obj)
174 _OutputHelper.Write (obj.ToString ());
178 public override void Write (string s)
180 _OutputHelper.Write (s);
184 public override void Write (char [] buffer, int index, int count)
186 _OutputHelper.Write (buffer, index, count);
190 public void WriteBytes (byte [] buffer, int index, int count)
192 _OutputStream.Write (buffer, index, count);
196 public override void WriteLine ()
198 _OutputHelper.Write ("\r\n");
202 public void WriteString (string s, int index, int count)
204 _OutputHelper.Write (s.Substring (index, count));