!HttpModule Code

Hier is hopelijk dan de code. Compileren en de dll in de bin van de website plaatsen.

Install door in de web.config van de te reducen website de httpmodule toe te voegen.
<httpModules>
<add name="Reduce" type="Reduce.Reduce,Reduce" />
</httpModules>


using System;
using System.IO;
using System.Web;

namespace Reduce
{
///


/// Reduce module cleans Http response stream from meaningless chars.
///

public class Reduce:IHttpModule
{
private HttpApplication mappCurrent; // The application

///


/// Instantiates Reduce
///

public Reduce()
{
// no init
}

///


/// Called when the client request start
///

///
/// Hier kunnen nog andere events gekoppeld worden..
///

///
The application public void Init(HttpApplication pappCtx)
{
pappCtx.PreSendRequestContent += new EventHandler(PreSendRequestContent);
pappCtx.PreRequestHandlerExecute += new EventHandler(PreRequestHandlerExecute);
mappCurrent = pappCtx;

}

///


/// Called for cleaning up
///

public void Dispose()
{
mappCurrent=null;
}

///


/// Event called when request is send to client
///

///
Caller ///
Empty argument private void PreSendRequestContent(object sender, EventArgs e)
{
mappCurrent.Response.Write("");
}

///


/// Event called when Page is handeld
///

///
Caller ///
Empty argument private void PreRequestHandlerExecute(object sender, EventArgs e)
{
mappCurrent.Response.Filter = new HttpStreamFilter(mappCurrent.Response.Filter);
mappCurrent.Response.Write("");
}
}

///


/// De
///

public class HttpStreamFilter : Stream
{
private Stream mseaSink;
private long mlngPosition;
private Token menmToken;

private enum Token
{
None,
Tag,
Comment,
Script,
Space
}

private enum Space
{
None,
CR,
LF,
Tab,
Space,
Nbsp
}

public HttpStreamFilter(Stream pseaSink)
{
menmToken = Token.None;
mseaSink = pseaSink;
}

// 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 mlngPosition; }
set { mlngPosition = value; }
}

public override long Seek(long plngOffset, System.IO.SeekOrigin pseoDirection)
{
return mseaSink.Seek(plngOffset, pseoDirection);
}

public override void SetLength(long plngLength)
{
mseaSink.SetLength(plngLength);
}

public override void Close()
{
mseaSink.Close();
}

public override void Flush()
{
mseaSink.Flush();
}

public override int Read(byte[] buffer, int offset, int count)
{
return mseaSink.Read(buffer, offset, count);
}

// The Write method actually does the filtering.
public override void Write(byte[] parrBuffer, int pintOffset, int pintCount)
{

// de bedoeling is om alle onnodige space en onnodige comments te filteren.
// probleem is dat dit een stream is, maw er komen array of byte binnen
// maar dat hoeft niet de hele stream te zijn...
// We moeten dus op basis van de vorige bytes en de nieuwe byte beslissen
// wat er moet gebeuren:
// Verwijder zonder check:
// Cr (behalve in een script Comment), Lf, Tab : done
// space: verwijderen als het vorige char een space , Cr,Lf of Tab was: done
// space na een < verwijderen : done
// space voor een > verwijderen
// Comments buiten een script block verwijderen
// dubble constructies verwijderen
// alleen voor HTML graag...
byte[] larrData = new byte[pintCount];

int lintDataPos = 0;
// copy only chars not being space, tab, cr, lf
for (int i = 0; i < pintCount; i++)
{
char c = (char) parrBuffer[pintOffset+i];

switch(c)
{
case '\t':
case '\r':
case '\n':
if (menmToken==Token.Tag)
{
menmToken = Token.Space;
}
break;
case ' ':
if (menmToken == Token.Space)
{
//vorige teken was ook een space
}
else
{
if (menmToken ==Token.Tag)
{
menmToken = Token.Space;
}
else
{
menmToken = Token.Space;
larrData[lintDataPos] = parrBuffer[pintOffset+i];
++lintDataPos;
}
}
break;
case '<':
menmToken = Token.Tag;
larrData[lintDataPos] = parrBuffer[pintOffset+i];
++lintDataPos;
break;
default:
menmToken = Token.None;
larrData[lintDataPos] = parrBuffer[pintOffset+i];
++lintDataPos;
break;
}
}
// write out only valid bytes in larrData (hopefully less than pintCount)
mseaSink.Write(larrData, 0, lintDataPos);
}
}
}