rendered paste bodythis isapi filter will output anything that is getting requested like http://localhost/helloWorld will answer with hello world, it registers the SF_NOTIFY_URL_MAP event and therefore it works, but i also need to read cookies, and to do that i need to register SF_NOTIFY_PREPROC_HEADERS , and when i do that i cannot read the url...........
library DomainMapper;
uses
Windows,
SysUtils,
Classes,
HTTPApp,
ISAPI2,
ComObj;
//kmemtable husk
const
SF_MAX_FILTER_DESC_LEN = (256 + 1);
SF_NOTIFY_SECURE_PORT = $00000001;
SF_NOTIFY_NONSECURE_PORT = $00000002;
SF_NOTIFY_READ_RAW_DATA = $00008000;
SF_NOTIFY_PREPROC_HEADERS = $00004000;
SF_NOTIFY_AUTHENTICATION = $00002000;
SF_NOTIFY_URL_MAP = $00001000;
SF_NOTIFY_ACCESS_DENIED = $00000800;
SF_NOTIFY_SEND_RAW_DATA = $00000400;
SF_NOTIFY_LOG = $00000200;
SF_NOTIFY_END_OF_NET_SESSION = $00000100;
SF_NOTIFY_ORDER_HIGH = $00080000;
SF_NOTIFY_ORDER_MEDIUM = $00040000;
SF_NOTIFY_ORDER_LOW = $00020000;
SF_NOTIFY_ORDER_DEFAULT = SF_NOTIFY_ORDER_LOW;
SF_NOTIFY_ORDER_MASK = SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or
SF_NOTIFY_ORDER_LOW;
SF_STATUS_REQ_FINISHED = $8000000;
SF_STATUS_REQ_FINISHED_KEEP_CONN = $8000001;
SF_STATUS_REQ_NEXT_NOTIFICATION = $8000002;
SF_STATUS_REQ_HANDLED_NOTIFICATION = $8000003;
SF_STATUS_REQ_ERROR = $8000004;
SF_STATUS_REQ_READ_NEXT = $8000005;
type
PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION;
HTTP_FILTER_VERSION = record
dwServerFilterVersion: DWORD;
dwFilterVersion: DWORD;
lpszFilterDesc: array[0..SF_MAX_FILTER_DESC_LEN - 1] of char;
dwFlags: DWORD;
end;
THTTP_FILTER_VERSION = HTTP_FILTER_VERSION;
LPHTTP_FILTER_VERSION = PHTTP_FILTER_VERSION;
LPVOID = POINTER;
TFilterGetServerVariableProc = function(var pfc; VariableName: PChar; Buffer: Pointer;
var Size: DWORD): BOOL; stdcall;
TFilterAddResponseHeadersProc = function(var pfc; lpszHeaders: PChar;
dwReserved: DWORD): BOOL; stdcall;
TFilterWriteClientProc = function(var pfc; Buffer: Pointer;
var Bytes: DWORD; dwReserved: DWORD): BOOL; stdcall;
TFilterAllocMemProc = function(var pfc; cbSize: DWORD;
dwReserved: DWORD): Pointer; stdcall;
TFilterServerSupportFunctionProc = function(var pfc; sfReq: DWORD;
pData: Pointer; ul1, ul2: DWORD): BOOL; stdcall;
PHTTP_FILTER_CONTEXT = ^THTTP_FILTER_CONTEXT;
THTTP_FILTER_CONTEXT = record
cbSize: DWORD;
Revision: DWORD;
ServerContext: Pointer;
ulReserved: DWORD;
fIsSecurePort: BOOL;
pFilterContext: Pointer;
GetServerVariable: TFilterGetServerVariableProc;
AddResponseHeaders: TFilterAddResponseHeadersProc;
WriteClient: TFilterWriteClientProc;
AllocMem: TFilterAllocMemProc;
ServerSupportFunction: TFilterServerSupportFunctionProc;
end;
HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT;
PCardinal = ^cardinal;
TGetServerVariable = function(var pfc: THTTP_FILTER_CONTEXT;
VariableName: PChar; Buffer: LPVOID;
BuffSize: PCardinal): BOOL; stdcall;
TGetHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT; lpszName: PChar;
var lpvBuffer; var lpdwSize: DWORD): BOOL ;
TSetHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT;
lpszName, lpszValue: PChar): BOOL ;
TAddHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT;
lpszName, lpszValue: PChar): BOOL ;
PHTTP_FILTER_PREPROC_HEADERS = ^THTTP_FILTER_PREPROC_HEADERS;
THTTP_FILTER_PREPROC_HEADERS = record
GetHeader: TGetHeaderProc;
SetHeader: TSetHeaderProc;
AddHeader: TAddHeaderProc;
dwReserved: DWORD;
end;
function HttpFilterProc(var FilterContext: HTTP_FILTER_CONTEXT; NotificationType: DWORD; pvNotification: LPVOID): DWORD; stdcall; export;
var
CookieBuffer: array[0..4096] of char;
URLBuffer: string;
URLBufferSize: cardinal;
slashPosInUrl: integer;
topRootFolder: string;
requestedURL: string;
Data: THTTP_FILTER_PREPROC_HEADERS;
redirectResponseHtml: string;
cookieSize: cardinal;
ssoCookie: string;
begin
if (NotificationType = SF_NOTIFY_URL_MAP ) then
begin
Data := THTTP_FILTER_PREPROC_HEADERS(pvNotification^);
cookieSize := SizeOf(CookieBuffer);
FillChar(CookieBuffer, cookieSize, 0);
TGetServerVariable(FilterContext.GetServerVariable) (FilterContext, 'URL', @CookieBuffer[0], @cookieSize);
FilterContext.WriteClient(FilterContext, @CookieBuffer[0] ,cookieSize, 0);
Result := SF_STATUS_REQ_FINISHED;
end;
end;
function TerminateFilter(Flags: DWORD): DWORD; stdcall; export;
begin
Result := 1;
end;
function GetFilterVersion(var pVer: HTTP_FILTER_VERSION): BOOL; stdcall; export;
begin
with pVer do
begin
dwFilterVersion := MakeLong(0 {minor}, 1 {major});
StrPCopy(lpszFilterDesc, '');
dwFlags := SF_NOTIFY_ORDER_DEFAULT or SF_NOTIFY_URL_MAP;
end;
Result := True;
end;
exports
GetFilterVersion,
HttpFilterProc,
TerminateFilter;
begin
end.
------------------------------------------------------------------------------------
----------------------------------CUT NEXT ISAPI FILTER-----------------------------
Here i register SF_NOTIFY_PREPROC_HEADERS and therefore i cannot read the url, it just comes out blank :(
I need to register SF_NOTIFY_PREPROC_HEADERS because when i do that i can read the cookies in the request
since i need to check if the url bust me protected i need the url, and then i need the cookie to test if the user is allowed access,
but i really cant find a way to get both............any suggestions?
library DomainMapper;
uses
Windows,
SysUtils,
Classes,
HTTPApp,
ISAPI2,
ComObj;
//kmemtable husk
const
SF_MAX_FILTER_DESC_LEN = (256 + 1);
SF_NOTIFY_SECURE_PORT = $00000001;
SF_NOTIFY_NONSECURE_PORT = $00000002;
SF_NOTIFY_READ_RAW_DATA = $00008000;
SF_NOTIFY_PREPROC_HEADERS = $00004000;
SF_NOTIFY_AUTHENTICATION = $00002000;
SF_NOTIFY_URL_MAP = $00001000;
SF_NOTIFY_ACCESS_DENIED = $00000800;
SF_NOTIFY_SEND_RAW_DATA = $00000400;
SF_NOTIFY_LOG = $00000200;
SF_NOTIFY_END_OF_NET_SESSION = $00000100;
SF_NOTIFY_ORDER_HIGH = $00080000;
SF_NOTIFY_ORDER_MEDIUM = $00040000;
SF_NOTIFY_ORDER_LOW = $00020000;
SF_NOTIFY_ORDER_DEFAULT = SF_NOTIFY_ORDER_LOW;
SF_NOTIFY_ORDER_MASK = SF_NOTIFY_ORDER_HIGH or SF_NOTIFY_ORDER_MEDIUM or
SF_NOTIFY_ORDER_LOW;
SF_STATUS_REQ_FINISHED = $8000000;
SF_STATUS_REQ_FINISHED_KEEP_CONN = $8000001;
SF_STATUS_REQ_NEXT_NOTIFICATION = $8000002;
SF_STATUS_REQ_HANDLED_NOTIFICATION = $8000003;
SF_STATUS_REQ_ERROR = $8000004;
SF_STATUS_REQ_READ_NEXT = $8000005;
type
PHTTP_FILTER_VERSION = ^HTTP_FILTER_VERSION;
HTTP_FILTER_VERSION = record
dwServerFilterVersion: DWORD;
dwFilterVersion: DWORD;
lpszFilterDesc: array[0..SF_MAX_FILTER_DESC_LEN - 1] of char;
dwFlags: DWORD;
end;
THTTP_FILTER_VERSION = HTTP_FILTER_VERSION;
LPHTTP_FILTER_VERSION = PHTTP_FILTER_VERSION;
LPVOID = POINTER;
TFilterGetServerVariableProc = function(var pfc; VariableName: PChar; Buffer: Pointer;
var Size: DWORD): BOOL; stdcall;
TFilterAddResponseHeadersProc = function(var pfc; lpszHeaders: PChar;
dwReserved: DWORD): BOOL; stdcall;
TFilterWriteClientProc = function(var pfc; Buffer: Pointer;
var Bytes: DWORD; dwReserved: DWORD): BOOL; stdcall;
TFilterAllocMemProc = function(var pfc; cbSize: DWORD;
dwReserved: DWORD): Pointer; stdcall;
TFilterServerSupportFunctionProc = function(var pfc; sfReq: DWORD;
pData: Pointer; ul1, ul2: DWORD): BOOL; stdcall;
PHTTP_FILTER_CONTEXT = ^THTTP_FILTER_CONTEXT;
THTTP_FILTER_CONTEXT = record
cbSize: DWORD;
Revision: DWORD;
ServerContext: Pointer;
ulReserved: DWORD;
fIsSecurePort: BOOL;
pFilterContext: Pointer;
GetServerVariable: TFilterGetServerVariableProc;
AddResponseHeaders: TFilterAddResponseHeadersProc;
WriteClient: TFilterWriteClientProc;
AllocMem: TFilterAllocMemProc;
ServerSupportFunction: TFilterServerSupportFunctionProc;
end;
HTTP_FILTER_CONTEXT = THTTP_FILTER_CONTEXT;
PCardinal = ^cardinal;
TGetServerVariable = function(var pfc: THTTP_FILTER_CONTEXT;
VariableName: PChar; Buffer: LPVOID;
BuffSize: PCardinal): BOOL; stdcall;
TGetHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT; lpszName: PChar;
var lpvBuffer; var lpdwSize: DWORD): BOOL ;
TSetHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT;
lpszName, lpszValue: PChar): BOOL ;
TAddHeaderProc = function(var pfc: THTTP_FILTER_CONTEXT;
lpszName, lpszValue: PChar): BOOL ;
PHTTP_FILTER_PREPROC_HEADERS = ^THTTP_FILTER_PREPROC_HEADERS;
THTTP_FILTER_PREPROC_HEADERS = record
GetHeader: TGetHeaderProc;
SetHeader: TSetHeaderProc;
AddHeader: TAddHeaderProc;
dwReserved: DWORD;
end;
function HttpFilterProc(var FilterContext: HTTP_FILTER_CONTEXT; NotificationType: DWORD; pvNotification: LPVOID): DWORD; stdcall; export;
var
CookieBuffer: array[0..4096] of char;
URLBuffer: string;
URLBufferSize: cardinal;
slashPosInUrl: integer;
topRootFolder: string;
requestedURL: string;
Data: THTTP_FILTER_PREPROC_HEADERS;
redirectResponseHtml: string;
cookieSize: cardinal;
ssoCookie: string;
begin
if (NotificationType = SF_NOTIFY_PREPROC_HEADERS ) then
begin
Data := THTTP_FILTER_PREPROC_HEADERS(pvNotification^);
cookieSize := SizeOf(CookieBuffer);
FillChar(CookieBuffer, cookieSize, 0);
TGetServerVariable(FilterContext.GetServerVariable) (FilterContext, 'URL', @CookieBuffer[0], @cookieSize);
FilterContext.WriteClient(FilterContext, @CookieBuffer[0] ,cookieSize, 0);
Result := SF_STATUS_REQ_FINISHED;
end;
end;
function TerminateFilter(Flags: DWORD): DWORD; stdcall; export;
begin
Result := 1;
end;
function GetFilterVersion(var pVer: HTTP_FILTER_VERSION): BOOL; stdcall; export;
begin
with pVer do
begin
dwFilterVersion := MakeLong(0 {minor}, 1 {major});
StrPCopy(lpszFilterDesc, '');
dwFlags := SF_NOTIFY_ORDER_DEFAULT or SF_NOTIFY_PREPROC_HEADERS;
end;
Result := True;
end;
exports
GetFilterVersion,
HttpFilterProc,
TerminateFilter;
begin
end.