[ zurück ]

Der große ISAPI-Test (Test-DLL)


Mit einer zweiten ISAPI-DLL sollen alle Eingangsinformationen ausgelesen und als lesbare Antwort an den Browser zurückgesandt werden. Eine solche Test-DLL ist hilfreich beim Aufspüren von Fehlern in der Kommunikation zwischen Client und Server. Das neue Projekt trägt den Namen IsapiTest.DPR. Gegenüber der Einstiegsversion gibt es folgende Veränderungen.

Die Projektdatei IsapiTest.DPR enthält nur ein Gerippe mit beiden Eintrittspunkten der DLL. Die eigentliche Funktionalität zur Antworterzeugung wurde in eine Unit TestMain.PAS ausgelagert. So halten Sie das Projekt übersichtlicher. Innerhalb der Hauptroutine HttpExtensionProc vermittelt der Aufruf von IsapiAction() den Zugriff die Erzeugung des Antworttextes in der Projektunit TestMain.PAS.

Im ISAPI-Testprogramm wird auf Hilfsroutinen aus meiner Unit IsapiHlp zurückgegriffen. Deshalb muß am Beginn der DLL-Funktion HttpExtensionProc die Adresse des Steuerblockes ECB an diese Unit übergeben werden. Da jeder Aufruf von HttpExtensionProc als neuer Thread abläuft, braucht auch jede Anforderung von Funktionen aus IsapiHlp die zugeordnete aktuelle ECB-Adresse.

function HttpExtensionProc(var ECB:TEXTENSION_CONTROL_BLOCK):DWORD;stdcall;
var ResStr: string;
    StrLen: DWORD;
begin
 IsapiHlp.pECB:=@ECB;
 ECB.lpszLogData:='DelphiTestDLL';
 ResStr:='';
 IsapiAction(ResStr); { hier eigentliche Aktion der Extension }
 ResStr:=Format(
  'HTTP/1.0 200 OK'#13#10'Content-Type: text/html'#13#10+
  'Content-Length: %d'#13#10'Content:'#13#10#13#10'%s',
  [Length(ResStr), ResStr]);
 StrLen:=Length(ResStr);
 ECB.WriteClient(ECB.ConnID,Pointer(ResStr),StrLen,0);
 ECB.dwHTTPStatusCode:=200;
 HttpExtensionProc:=HSE_STATUS_SUCCESS;
end;

In der aus Übersichtsgründen ausgelagerten Projektunit TestMain wird der Ergebnisstring ResStr mit den Ausgabedaten versehen. Das erfolgt dort in der Procedur IsapiAction, die ihrerseits als lokalen Variablenparameter für das Ergebnis einfach nur s verwendet.

Dabei können Sie wiederum Funktionen aus meiner Werkzeugsammlung IsapiHlp verwenden. Beispielsweise erledigt die Funktion HtmlHeader die komplette Generierung eines HTML-Kopfes mit Titel, Hintergrundfarbe und Hintergrundbild bis einschließlich des einleitenden <BODY>-Tags. Die Funktion HtmlFooter am Ende schließt den HTML-Text wieder ab.

procedure IsapiAction(var s: String);
var FldList: TstringList;
    i: Integer
begin
 s:= HtmlHeader('ISAPI-Test','FFFFFF','/images/struct.gif') +
                '<H1>ISAPI-Test</H1><HR>'+...
  
     { Aufbau des dynamische HTML-Textes }
  
 s:= s + '<HR>[ ' + HtmlLink('/','Home') + ' ]' +
         '<P ALIGN="center">' + FormatDateTime(yy-mm-dd, hh:nn:ss',Now()) +
         '<BR>&copy; Webmaster' + HtmlFooter;
end;

Als wesentliche Programmaktion ermitteln Sie in der hier entstehenden Test-DLL alle Eingabedaten und Servervariablen und senden sie an den Client zurück. Auch dazu bieten sich die Tools aus IsapiHlp an. ECBSize, ECBVersion usw. sind dort deklarierte Funktionen, mit denen Sie den Zugriff auf die Eingangsdaten noch etwas verkürzen.

s:= s + Format(
      '<H3>ECB-Variablen (Input)</H3>' +
      '<UL><LI>ECB-Size: %d' +
      '<LI>Version: %.8x' +
      '<LI>ConnID: %.8x' +
      '<LI>Method: %s' +
      '<LI>QueryString: %s' +
      '<LI>TotalBytes: %d' +
      '<LI>Available: %d</UL>',
      [ECBSize, ECBVersion, ECBConnID, ECBMethod,
       ECBQueryString, ECBTotalBytes, ECBAvailable]);

Ähnlich gestalten Sie den Abruf der Servervariablen. Die Funktion GetVar kennen Sie ja bereits aus dem vorherigen Abschnitt von der Beschreibung der Eingangsvariablen.

s:= s + Format(
      '<HR><H3>Server-Variablen</H3>' +
      '<UL><LI>REMOTE_ADDR: %s' +
      '<LI>REMOTE_HOST: %s' +
      '<LI>HTTP_ACCEPT: %s' +
      '<LI>ALL_HTTP: %s' +
      '<LI>URL: %s</UL>',
      [GetVar('REMOTE_ADDR'), GetVar('REMOTE_HOST'),
       GetVar('HTTP_ACCEPT'), GetVar('ALL_HTTP'), GetVar('URL')]);

Den kompletten Quelltext für die Test-DLL finden Sie als Projekt IsapiTst am Ende dieser Seite zum Download. Damit Sie Ihren Test noch schneller durchführen können, beachten Sie bitte folgende Hinweise.

Die fertige DLL plazieren Sie in das Serververzeichnis für ausführbare Scripte. Danach können Sie die Extension bereits über die Adreßzeile Ihres Browsers aufrufen.

http://hostname/scripts/IsapiTst.dll?TestParmeter

Für den Test aus einem Formular heraus kopieren Sie das beiliegende Formular IsapiTest.htm in ein Verzeichnis Ihres Webs. Gegebenenfalls müssen Sie noch die Formularaktion umschreiben, um sie an Ihre Gegebenheiten anpassen. Die Bilder zeigen sowohl Formular als auch Antwort der ISAPI-Erweiterung.

Screen1

Screen2

Der Tabellentest

An dieser Stelle finden Sie noch ein weiteres Test-Projekt. Die Webservererweiterung IsapiTab.dll generiert eine dynamische HTML-Ausgabe in Form einer Tabelle mit Zufallsdaten. Damit können Sie das Verhalten Ihres Webs bei Ausgabe längerer Dokumente testen.

Der Aufruf erfolgt mit:

http://MyServer/scripts/IsapiTab.dll?Zeilenzahl

Setzen Sie für den Parameter Zeilenzahl einen beliebigen Zahlenwert ein. Ohne den Parameter werden 10 Tabellenzeilen generiert.

Der Hintergrund dieses ISAPI-Test-Projektes ist folgender: Einige Programmierer beklagen Probleme bei der Übertragung langer Dokumente. In solchen Fällen hat es geholfen, wenn in der Projektdatei bei Uses als erstes die Unit ShareMem aufgeführt wurde. Dann muß aber auch die Delphi-Speicherverwaltungs-DLL DELPHIMM.DLL bzw. BORLNDMM.DLL im System-Pfad Ihres Betriebssystems zu finden sein.


Download der Programmquelltexte:
Disk IsapiTst.zip - der ISAPI-Test gemäß Abbildung (5 kByte)
Disk IsapiTab.zip - der Tabellentest (4 kByte)

[ Seitenanfang ] [ ISAPI ]

J. Hummel,   2000