To see what is delivered by the friendly URLs output stream is pretty complex because the friendly URL handling in EPiServer CMS 5 and above replaces the original output stream with its own HtmlRewriteStream.
This stream is closed and can’t be read when deliver the data, to listen to this stream you have to replace this stream with your own.
Installation on an IIS7
In web.config register the module before the EPiServer UrlRewriteModule.
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
…
<add name="TestModule" type="EPiServer.TestModule" preCondition="managedHandler" />
<add name="UrlRewriteModule" type="EPiServer.Web.UrlRewriteModule, EPiServer" preCondition="managedHandler" />
The code for the handler
using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Web;
using EPiServer.Web;
namespace EPiServer
{
public class TestModule : IHttpModule
{
public void Dispose() {}
object _application;
public void Init(HttpApplication context)
{
UrlRewriteModuleBase.HttpRewriteInit +=
new EventHandler<UrlRewriteEventArgs>(
UrlRewriteModuleBase_HttpRewriteInit);
context.EndRequest += new EventHandler(context_EndRequest);
}
void UrlRewriteModuleBase_HttpRewriteInit(
object sender,
UrlRewriteEventArgs e)
{
UrlRewriteModuleBase module = sender as UrlRewriteModuleBase;
if (module != null)
{
module.HtmlAddedRewriteToExternalFilter +=
new EventHandler<UrlRewriteEventArgs>(
module_HtmlAddedRewriteToExternalFilter);
module.HtmlAddingRewriteToExternalFilter +=
new EventHandler<UrlRewriteEventArgs>(
module_HtmlAddingRewriteToExternalFilter);
}
}
void module_HtmlAddingRewriteToExternalFilter(
object sender,
UrlRewriteEventArgs e)
{
module_HtmlAddedRewriteToExternalFilter(sender, e);
}
void module_HtmlAddedRewriteToExternalFilter(
object sender,
UrlRewriteEventArgs e)
{
HttpApplication application = e.Internal as HttpApplication;
if (application == null)
{
return;
}
Stream originalStream = application.Response.Filter;
if (originalStream is HtmlRewriteStream)
{
return;
}
application.Response.Filter = new StreamFilter(
originalStream,
application.Response.ContentEncoding);
}
void context_EndRequest(object sender, EventArgs e)
{
HttpApplication app = sender as HttpApplication;
if (app.Context.Response.Filter is HtmlRewriteStream)
{
bool l = app.Context.Response.Filter.CanRead;
}
}
}
public class StreamFilter : Stream
{
private MemoryStream _spyStream;
private Stream _originalStream;
private Encoding _encoding;
public StreamFilter(Stream originalStream, Encoding encoding)
{
_originalStream = originalStream;
_encoding = encoding;
_spyStream = new MemoryStream();
}
public override bool CanRead
{
get { return _originalStream.CanRead; }
}
public override bool CanSeek
{
get { return _originalStream.CanSeek; }
}
public override bool CanWrite
{
get { return _originalStream.CanWrite; }
}
public override void Flush()
{
_spyStream.Flush();
_originalStream.Flush();
}
public override long Length
{
get { return _originalStream.Length; }
}
public override long Position
{
get { return _originalStream.Position; }
set {
_spyStream.Position = value;
_originalStream.Position = value;
}
}
public override int Read(byte[] buffer, int offset, int count)
{
return _originalStream.Read(buffer, offset, count);
}
public override long Seek(long offset, SeekOrigin origin)
{
_spyStream.Seek(offset, origin);
return _originalStream.Seek(offset, origin);
}
public override void SetLength(long value)
{
_spyStream.SetLength(value);
_originalStream.SetLength(value);
}
public override void Write(byte[] buffer, int offset, int count)
{
_spyStream.Write(buffer, offset, count);
_originalStream.Write(buffer, offset, count);
}
public override void Close()
{
byte[] spyBuffer = new byte[1000];
while (_spyStream.Read(spyBuffer, 0, spyBuffer.Length) > 0)
{
Debug.WriteLine(_encoding.GetString(spyBuffer));
}
_spyStream.Close();
_originalStream.Close();
}
}
}