\documentclass[a4paper, 11pt]{article}
\renewcommand{\familydefault}{\sfdefault}
\usepackage{a4wide}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{color}
\usepackage{graphicx}
\usepackage{setspace}
\usepackage{ulem}
\usepackage{listings}
\usepackage{float}
\usepackage[rflt]{floatflt}
\usepackage{tabularx}
\setlength{\parindent}{0pt}
\title{ISAPI-Filter}
\usepackage[
pdftitle={ISAPI-Filter}
pdfsubject={Internet Server Application Programming Interface Filter}
pdfauthor={Udo Schmal}
pdfkeywords={Free Pascal, ISAPI, Filter, GetFilterVersion, HttpFilterProc, TerminateFilter}
]{hyperref}
\definecolor{darkblue}{rgb}{0,0,.5}
\hypersetup{pdftex=true, colorlinks=true, breaklinks=true, linkcolor=darkblue, menucolor=darkblue, pagecolor=darkblue, urlcolor=darkblue}
\begin{document}ISAPI-Filter
\singlespacing
{\LARGE \textbf{\label{sec:title}ISAPI-Filter}}

Wie schon erwähnt sind bei einer ordentlichen Implementierung drei Funktionen zu exportieren.

\singlespacing
\textbf{GetFilterVersion:}

In dieser Funktion ist ein Record zu füllen mit der Versionsnummer einer Beschreibung und am wichtigsten den Flags.\newline
 Die Flags zeigen dem Webserver an welche Events (Notifications) siehe Tabelle 1, vom ISAPI-Filter bearbeitet werden.

\singlespacing
\textbf{HttpFilterProc:}

Diese Funktion bearbeitet alle Events (Notifications) siehe Tabelle 1, es ist darauf zu achten das am Ende im Normal-Fall der Result - Wert auf SF\_STATUS\_REQ\_NEXT\_NOTIFICATION steht, falls die Bearbeitung im Filter nicht komplett erledigt wurde! Zu den einzelnen Notifications komme ich später.

\singlespacing
\textbf{TerminateFilter:}

In dieser Funktion ist grundsätzlich erst einmal nichts erforderlich außer eine positive Rückmeldung an den Server zu senden.

\singlespacing
{\large \textbf{Notifications}}

Für quasi jedes Event was im Webserver ausgelöst wird gibt es eine Einsprungmöglichkeit zum Überarbeiten oder um die Arbeit selbst zu übernehmen. Fangen wir mit einem der Interessantesten an SF\_NOTIFY\_PREPROC\_HEADERS, hier stehen alle Informationen bezüglich eines Requests zur Verfügung, die dann bearbeitet oder ergänzt werden können, um dann vom Webserver weiter ausgeführt werden zu können, also die klassische Möglichkeit um einen URL-Rewriter zu erzeugen.

Da ich wie ich schon erwähnt habe, mehr auf objektorientierte Programmierung stehe hier wieder nur ein kleines Beispiel, aber eines was man zum Auffinden von Fehlern in einem Webauftritt gut benutzen kann, dieses Filter schreibt die Request Header von Fehlerhaften Seitenaufrufen in einen Logfile. Aber das Beste kommt noch, falls der Application Pool auf dem IIS hängt dann wird er von diesem Filter neu gestartet, dafür wird allerdings noch ein kleines Programm \href{https://www.gocher.me/RecycleAppPool}{RecycleAppPool.exe} benötigt!\newline


\href{https://www.gocher.me/code/hang_filter.lpr}{hang\_Filter.lpr}

\href{https://www.gocher.me/code/statusutils.pas}{statusutils.pas}
\end{document}