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
}
}
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
}
}