Стандартное CGI приложение должно анализировать переменные среды для определения метода передачи и размера посылаемой информации через стандартный ввод. Для получения списка переменных среды я всегда использую простой компонент, который я написал очень давно и компилирую его с помощью директив условной компиляции, как в Дельфи 1, так и в Дельфи 2.
unitTBDosEnv;
interface
uses
SysUtils, WinTypes, WinProcs, Classes;
type
TBDosEnvironment = class(TComponent)
public
{ Public class declarations (override) }
constructorCreate(AOwner: TComponent); override;
destructorDestroy; override;
private
{ Private field declarations }
FDosEnvList: TStringList;
protected
{ Protected method declarations }
functionGetDosEnvCount: Word;
public
{ Public interface declarations }
functionGetDosEnvStr( ConstName: String): String;
{ This function is a modified version of the GetEnvVar function that
appears in the WinDos unit that comes with Delphi. This function's
interface uses Pascal strings instead of null-terminated strings.
}
propertyDosEnvCount: Word readGetDosEnvCount;
propertyDosEnvList: TStringList readFDosEnvList;
end;
implementation
constructorTBDosEnvironment.Create(AOwner: TComponent);
varP: PChar;
i: Integer;
begin
inheritedCreate(AOwner);
FDosEnvList := TStringList.Create;
{$IFDEF WIN32}
P := GetEnvironmentStrings;
{$ELSE}
P := GetDosEnvironment; { Win API }
{$ENDIF}
i := 0;
whileP^ <> #0 do
begin
Inc(i);
FDosEnvList.Add(StrPas(P));
Inc(P, StrLen(P)+1) { Fast Jump to Next Var }
end;
end {Create} ;
destructorTBDosEnvironment.Destroy;
begin
FDosEnvList.Free;
FDosEnvList := nil;
inheritedDestroy
end {Destroy} ;
functionTBDosEnvironment.GetDosEnvCount: Word;
begin
Result := 0;
ifAssigned(FDosEnvList) thenResult := FDosEnvList.Count
end {GetDosEnvCount} ;
functionTBDosEnvironment.GetDosEnvStr( ConstName: String): String;
vari: Integer;
Tmp: String;
begin
i := 0;
Result := '';
ifAssigned(FDosEnvList) then whilei do
begin
Tmp := FDosEnvList[i];
Inc(i);
ifPos(Name,Tmp) = 1 then
begin
Delete(Tmp,1,Length(Name));
ifTmp[1] = '=' then
begin
Delete(Tmp,1,1);
Result := Tmp;
i := FDosEnvList.Count { end while-loop }
end
end
end
end {GetDosEnvStr} ;
end.
Данный компонент получает список переменных среды во время своего создания. Свойство DosEnvCount и DosEnvList является свойством только для чтения и поэтому лучше его создавать его в на ходу, а не бросать на форму, так как берется только 'свежий' список переменных среды, а не загружается из .DFM файла).
Среди переменных среды есть переменная с именем REQUEST_METHOD. Она должна иметь значение POST для нашего примера (Я не люблю другие методы). Затем мы должны найти размер информации, которая передана нам. Для этого мы должны получить переменную CONTENT_LENGTH. Сама информация поступает к нам через стандартный ввод (без маркера конца файла, поэтому наша задача не пытаться читать больше, чем нам передано). Данные поступающие через стандартный ввод имеют следующую форму FIELD=VALUE и разделяется с помощью символа '&'. Например: AUTHOR="Bob_Swart"&. Поскольку мы имеем весь входной поток, как одну длинную строку, то мы можем быстро найти параметр AUTHOR с помощью следующей функции:
var
Data: String;
functionValue(Const Field: ShortString): ShortString;
vari: Integer;
begin
Result := '';
i := Pos(Field+'=',Data);
ifi = 0 then
begin
Inc(i,Length(Field)+1);
whileData[i] <> '&' do
begin
Result := Result + Data[i];
Inc(i)
end
end
end {Value} ;
Следующий шаблон кода показывает как динамически создать переменную TBDosEnvironment, прочитать информацию со стандартного ввода и получить строку готовую для анализа переменных формы.
Читать дальше