Jak na ISAPI skripty v Delphi?
PinkNet Web Server je vybaven zßkladnφ podporou ISAPI skript∙,
kterß mu umo╛≥uje spolupracovat s aplikacemi, kterΘ byli vyvinuty pro Win32
platformu v rozhranφ M$ Internet Server API - ISAPI.
Psanφ skript∙ je pom∞rn∞ jednoduchΘ, pokud mßte alespo≥
p°edstavu jak se volajφ. Jß osobn∞ pou╛φvßm Delphi a proto nßsledujφcφ
ukßzka bude prßv∞ pro n∞j.
Zde je v²pis jedoduchΘho skriptu (dostupn² na adrese
http://localhost/demo/cgi-bin/isapi_minimal.dll
ve standartnφ instalaci PNWS):
library ISAPI_Minimal;
uses
SysUtils,
Classes,
isapi2 in '\Program Files\Borland\Delphi\Source\RTL\WIN\isapi2.pas';
// Zalezi na velikosti pismen v nazvu !!!!
function GetExtensionVersion(var ver: THSE_VERSION_INFO): Boolean;
stdcall;
begin
result:=True;
// Rekni, ze je vse OK -> sice nic nevracime, ale to nevadi
end;
// Zalezi na velikosti pismen v nazvu !!!!
function HttpExtensionProc(var ecb: TEXTENSION_CONTROL_BLOCK):
LongInt; stdcall;
var
FN_Write: TWriteClientProc;
s: String;
len: Integer;
begin
// Vytvor si funkci pro zapis dat
@FN_Write:=@ecb.WriteClient;
// Vytvor si do stringu S odpoved ve formatu HTML
s:= 'HTTP/1.0 200 OK'#13#10#13#10;
s:=s+'<html><head>'#13#10;
s:=s+' <title>ISAPI skript</title>'#13#10;
s:=s+'</head><body bgcolor=white>'#13#10;
s:=s+'<h1>Generovanß strßnka</h1>'#13#10;
s:=s+'Tento text je generovan² knihovnou ISAPI v serveru PNWS'#13#10;
s:=s+'</body></html>';
len:=Length(s);
// Zapis do prohlizece
FN_WRITE(ecb.ConnID, PChar(s), len, 0)
// No a to je asi vse... ...je jasne, ze skript nebude omezen jen na
// jednoduche splacani neceho do stringu S, ale bude neco konat
end;
// Potreba pro export funkci
exports
GetExtensionVersion,
HttpExtensionProc;
begin
end.
Je jasnΘ, ╛e v∞t╣ina skript∙ pot°ebuje VSTUPN═ data a proto
si ukß╛eme i jak si je od serveru zφstkat. Pro zφskßnφ dat pomocφ metody
po╛adavky GET (tedy skript.dll?data) pou╛ijeme zßznam typu PChar dostupn²
p°es jmΘno
ecb.lpszQueryString. Data p°es metodu POST jsou
ulo╛ena v bloku na kter² ukazuje pointer
ecb.lpbData. Jejich
velikost je urΦena prom∞nou
ecb.cbTotalBytes.
Pro zφskßnφ prom∞nΘ od serveru (nap°φklad jmΘno serveru,
Φi typ prohlφ╛eΦe) m∙╛eme do procedury
HttpExtensionProc p°idat
nßsledujφcφ vno°enou proceduru:
// Fuknce vracφ promenou prostredi od serveru
function GetServerVar(name:string):string;
var FN_GetVariable:TGetServerVariableProc;
pch:PChar;
len:integer;
begin
// Prirazeni procedury
@FN_GetVariable:=@ecb.GetServerVariable;
// maximalni velikost prichozich dat
len:=1024;
pch:=StrAlloc(len);
// Zeptej se na data
if FN_GetVariable(ecb.ConnID,PChar(name),pch,len) then
result:=pch
else
result:='*nedefinovano*';
end;