CodePaste Logo
New Snippet New Snippet Recent Snippets Recent Snippets My Snippets My Snippets Web Code Search Snippets Search
Sign inor Register
Language: C#

Capture and Transform Response Output using a Filter

659 Views
Copy Code Show/Hide Line Numbers
/// <summary>
/// Summary description for ResponseFilter.
/// </summary>
public partial class ResponseFilter : System.Web.UI.Page
{
   protected System.Web.UI.HtmlControls.HtmlForm Form1;
   protected System.Web.UI.WebControls.TextBox TextBox1;
 
   protected void Page_Load(object sender, System.EventArgs e)
   {
      // Put user code to initialize the page here
         if (this.chkEnableFilter.Checked)
             Response.Filter = new UpperCaseFilter(Response.Filter);
         else
         {
             // We have to redirect to get back to non-encoded page
             if (IsPostBack)
                 Response.Redirect("ResponseFilter.aspx");
         }
   }
 
 
}
 
 
 public class UpperCaseFilter : Stream
 // This filter changes all characters passed through it to uppercase.
 {
     private Stream _stream;
     private long _position;
 
     public UpperCaseFilter(Stream sink)
     {
         _stream = sink;
     }
 
     // The following members of Stream must be overriden.
     public override bool CanRead
     {
         get { return true; }
     }
 
     public override bool CanSeek
     {
         get { return true; }
     }
 
     public override bool CanWrite
     {
         get { return true; }
     }
 
     public override long Length
     {
         get { return 0; }
     }
 
     public override long Position
     {
         get { return _position; }
         set { _position = value; }
     }
 
     public override long Seek(long offset, System.IO.SeekOrigin direction)
     {
         return _stream.Seek(offset, direction);
     }
 
     public override void SetLength(long length)
     {
         _stream.SetLength(length);
     }
 
     public override void Close()
     {
         _stream.Close();
     }
 
     public override void Flush()
     {
         ms = TransformStream(ms);
         _stream.Write(ms.ToArray(), 0, (int)ms.Length);
 
         _stream.Flush();
     }
 
     public override int Read(byte[] buffer, int offset, int count)
     {
         return _stream.Read(buffer, offset, count);
     }
 
     MemoryStream ms = new MemoryStream(5000);
     int buffPointer = 0;
 
     // The Write method actually does the filtering.
     public override void Write(byte[] buffer, int offset, int count)
     {       
         // copy to holding buffer
         ms.Write(buffer,0, count);
         buffPointer += count;
 
        // _stream.Write(buffer, 0, count);
     }
 
     protected MemoryStream TransformStream(MemoryStream ms)
     {
         string text = Encoding.Default.GetString(ms.ToArray());
 
         text = text.Replace("the", "THE BIG REPLACEMENT CAPER");
 
         return new MemoryStream(Encoding.Default.GetBytes(text));            
     }
 }
 
by Rick Strahl
  November 11, 2009 @ 5:19pm
Tags:
Description:
The trick in this routine is to implement Write() by only capturing the output, then using Flush() to get the completed stream and transform it before writing it all back out.

Add a comment


Report Abuse
brought to you by:
West Wind Techologies



If you find this site useful and use it frequently please consider making a donation to support this free service.
Donate