Solved

ISAPI Filter? HOW?

Posted on 2001-06-16
5
444 Views
Last Modified: 2011-05-11
Hello,

I am looking for a way to write a ISAPI filter in Delphi. Can anyone point me into a direction where to find examples and/or documentation on this matter.

Thanx.
0
Comment
Question by:mtieland
  • 3
  • 2
5 Comments
 
LVL 17

Accepted Solution

by:
inthe earned 100 total points
ID: 6198058
0
 
LVL 17

Expert Comment

by:inthe
ID: 6198063
a funny example from a teamb member (nick h)
it sends all incoming requests from an MSIE client
to a virtual directory called /NoIE/

library browser;

uses
  Windows,
  SysUtils,
  ISAPI2;

const
  FilterDescription = 'An ISAPI filter that will not let Internet
Explorer into the site.';

function GetFilterVersion(var pVer : THTTP_FILTER_VERSION) : BOOL;
export; stdcall;
begin
  Result := True;
  try
    pVer.dwFlags :=        (SF_NOTIFY_SECURE_PORT
                         or SF_NOTIFY_NONSECURE_PORT
                         or SF_NOTIFY_PREPROC_HEADERS //This is what
we are interested in
                         or SF_NOTIFY_ORDER_LOW
                         );
    pVer.dwFilterVersion := HTTP_FILTER_REVISION;
    StrPCopy(pVer.lpszFilterDesc, FilterDescription);
  except
    Result := False;
  end;
end;

function HttpFilterProc( var pfc: THTTP_FILTER_CONTEXT;
                                  NotificationType : DWORD;
                                  pvNotification   : Pointer): DWORD;
export; stdcall;
var
  PreprocHeaders : THTTP_FILTER_PREPROC_HEADERS;
  Buffer: array[0..1024] of Char;
  BufferSize: DWORD;
  AgentStr, URL: string;
  aPos: Integer;
const
  sUserAgent = 'USER-AGENT:';
  sURL       = 'url';
  NewURL = '/NoIE/';  //Note -- the URL _must_ have a '/' on the end
by the end of this function

function NoIE: DWORD;
begin
  PreprocHeaders := THTTP_FILTER_PREPROC_HEADERS(pvNotification^);
//cast to proper record type
  BufferSize := SizeOf(Buffer);
  PreprocHeaders.GetHeader(pfc, sUserAgent, Buffer, BufferSize);
//Grab the URL.  It will be everything after the domain
  SetString(AgentStr, Buffer, BufferSize);
  if Pos('MSIE', AgentStr) > 0 then //if we are dealing with MSIE
  begin
    BufferSize := SizeOf(Buffer); //Reset Buffer for new use
    PreprocHeaders.GetHeader(pfc, sURL, Buffer, BufferSize);
    SetString(URL, Buffer, BufferSize);
    //Replace whatever the URL is with the /NoIE/ URL
    aPos := Pos('/', URL);
    Delete(URL, aPos, Length(URL) - aPos + 1);
    URL := Concat(URL, NewURL);
    //This sends out the new header and sents the request on its way
    PreprocHeaders.SetHeader(pfc, sURL, PChar(URL));
  end;
  Result := SF_STATUS_REQ_NEXT_NOTIFICATION;  //Means all done and
ready to go on
end;

begin
   case NotificationType of
       SF_NOTIFY_PREPROC_HEADERS : Result := NoIE;
     else
       Result := SF_STATUS_REQ_NEXT_NOTIFICATION;
     end;
end;

exports
  HttpFilterProc,
  GetFilterVersion;


end.
 
0
 
LVL 17

Expert Comment

by:inthe
ID: 6198078
he has a article here but im having diffuculty getting the page to load so dont kow if its still there or not:
www.xapxone.com/html/dl304.htm
0
 

Author Comment

by:mtieland
ID: 6198646
Exactly what I was looking for,

And a funny way of writing too...

Thanx a lot.

(Sorry for the others I can give points only once so the
first good answer gets the points)
0
 

Author Comment

by:mtieland
ID: 6201308
Something I found out about redirecting on the URL_MAP event:

res := 'Location: ' + 'http://www.mylink.com' + #13+#10+#13+#10;
TServerSupportFunc (pfc.ServerSupportFunc) (pfc, SF_REQ_SEND_RESPONSE_HEADER,pChar('302 Redirect'), Cardinal(PChar(res)) , 0);

The second line shows the way you should do the actual redirect!

Martijn
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Introduction I have seen many questions in this Delphi topic area where queries in threads are needed or suggested. I know bumped into a similar need. This article will address some of the concepts when dealing with a multithreaded delphi database…
Illustrator's Shape Builder tool will let you combine shapes visually and interactively. This video shows the Mac version, but the tool works the same way in Windows. To follow along with this video, you can draw your own shapes or download the file…
This video demonstrates how to create an example email signature rule for a department in a company using CodeTwo Exchange Rules. The signature will be inserted beneath users' latest emails in conversations and will be displayed in users' Sent Items…

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now