|
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;
|
|