locked
IHttpModule Filter Html response Sharepoint RRS feed

  • Question

  • User231032217 posted

    Hi,

    I'm rather new to both ASP.net and Sharepoint and I need to do some filtering of the response output from a Sharepoint application.

    I've read about the possibility to intercept the response in ASP.net applications "just before" it is sent to the client. It succeeded to do that for asp-pages served by Sharepoint, but my problem is that I want to intercept the pure HTML files only.

    I do catch the response but I'm not able to get the call to the overridden write() in my filter. It only works for the asp-pages.

    See the code below. Could somebody please have a look and try to help me out =)

    public class MOSSCleanupModule : IHttpModule
    {
       public void Init(HttpApplication app)
       {
          app.ReleaseRequestState += new EventHandler(InstallResponseFilter);
       } 
      private void InstallResponseFilter(object sender, EventArgs e)
      {
         HttpResponse response = HttpContext.Current.Response;
         HttpRequest request = HttpContext.Current.Request;
         if (response.ContentType == "text/html" && request.Url.AbsolutePath.EndsWith(".htm"))
         {
            Debug.Write("in InstallResponseFilter()");
            response.Filter = new ModifyHtmlContentFilter(response.Filter);
         }
      }
    
      public void Dispose()
      {}
    }
    
    public class ModifyHtmlContentFilter : Stream
    {
       private Stream responseStream;
    
       public ModifyHtmlContentFilter(Stream inputStream)>
       {
          Debug.Write("in ModifyHtmlContentFilter");
          this.responseStream = inputStream;
       }    public override void Write(byte[] buffer, int offset, int count)
       {
          Debug.Write("in custom Write()");
          StringBuilder html = new StringBuilder(System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count));
          this.modifyHtml(html, "..");
          byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(html.ToString());
          responseStream.Write(data, 0, data.Length);
        } 
       private void modifyHtml(StringBuilder html, string search)
       {
          Debug.Write("in modifyHtml()");
          // Modify the html
       }
    
    #region Filter overrides 
    public override bool CanRead{get{return true;}
    
    public override bool CanSeek{get{return true;}} public override bool CanWrite{get{return true;}} 
    public override void Close(){responseStream.Close();}
    
    public override void Flush(){responseStream.Flush();} 
    public override long Length{get{return 0;}}
    
    public override long Position{get{return position;}set{position = value;}} 
    public override long Seek(long offset, SeekOrigin origin){return responseStream.Seek(offset, origin);}
    
    public override void SetLength(long length){responseStream.SetLength(length);} 
    public override int Read(byte[] buffer, int offset, int count){return responseStream.Read(buffer, offset, count);}
    
    #endregion
    
    }
    }
    
     
    Monday, December 29, 2008 6:02 AM

Answers

  • User231032217 posted

    It started working  for pure html file when I changed the EventHandler to BeginRequest to catch it earlier in the pipeline.

    • Marked as answer by Anonymous Thursday, October 7, 2021 12:00 AM
    Tuesday, December 30, 2008 4:50 AM