?
Solved

ISAPI Filter? HOW?

Posted on 2001-06-16
5
Medium Priority
?
457 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 400 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

Keep up with what's happening at Experts Exchange!

Sign up to receive Decoded, a new monthly digest with product updates, feature release info, continuing education opportunities, and more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In this tutorial I will show you how to use the Windows Speech API in Delphi. I will only cover basic functions such as text to speech and controlling the speed of the speech. SAPI Installation First you need to install the SAPI type library, th…
This is an update to some code that someone else posted on Experts Exchange. It is an alternate approach, I think a little easier to use, & makes sure that things like the Task Bar will update.
Enter Foreign and Special Characters Enter characters you can't find on a keyboard using its ASCII code ... and learn how to make a handy reference for yourself using Excel ~ Use these codes in any Windows application! ... whether it is a Micr…
There may be issues when you are trying to access Outlook or send & receive emails or due to Outlook crash which leads to corrupt or damaged PST file. To eliminate the corruption from your PST file, you need to repair the corrupt Outlook PST file. U…
Suggested Courses

621 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