Интернет решения от доктора Боба - страница 17

стр.

Нажатие на клавишу "Get Result" посылает информацию на Web сервер, котрый запускает delbooks.exe приложение с информацией введенной на форме. В нашем случае это может быть DELPHI="2", LEVEL="3", TITLE="", AUTHOR="Bob_Swart", PUBLISHER="" и ISBN="" (символ подчеркивания здесь означает пробел). Delphi 2 CGI приложение delbooks.exe обрабатывает полученную информацию, выполняет запрос и генерирует динамическую HTML страницу, которую отправляет на стандартный вывод. Web затем отправляет ее клиенту в его Webбраузеру который отображает ее на экране.

2.2.3. Переменные среды

Стандартное CGI приложение должно анализировать переменные среды для определения метода передачи и размера посылаемой информации через стандартный ввод. Для получения списка переменных среды я всегда использую простой компонент, который я написал очень давно и компилирую его с помощью директив условной компиляции, как в Дельфи 1, так и в Дельфи 2.

unit TBDosEnv;

interface

uses

>   SysUtils, WinTypes, WinProcs, Classes;

type

>   TBDosEnvironment = class(TComponent)

>   public

>   { Public class declarations (override) }

>     constructor Create(AOwner: TComponent); override;

>     destructor Destroy; override;

>   private

>   { Private field declarations }

>     FDosEnvList: TStringList;

>   protected

>   { Protected method declarations }

>     function GetDosEnvCount: Word;

>   public

>   { Public interface declarations }

>     function GetDosEnvStr(Const Name: 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.

>     }

>     property DosEnvCount: Word read GetDosEnvCount;

>     property DosEnvList: TStringList read FDosEnvList;

>   end;

implementation

>   constructor TBDosEnvironment.Create(AOwner: TComponent);

>   var P: PChar;

>       i: Integer;

>   begin

>     inherited Create(AOwner);

>     FDosEnvList := TStringList.Create;

>     {$IFDEF WIN32}

>     P := GetEnvironmentStrings;

>     {$ELSE}

>     P := GetDosEnvironment; { Win API }

>     {$ENDIF}

>     i := 0;

>     while P^ <> #0 do

>     begin

>       Inc(i);

>       FDosEnvList.Add(StrPas(P));

>       Inc(P, StrLen(P)+1) { Fast Jump to Next Var }

>     end;

>   end{Create};

>   destructor TBDosEnvironment.Destroy;

>   begin

>     FDosEnvList.Free;

>     FDosEnvList := nil;

>     inherited Destroy

>   end{Destroy};

>   function TBDosEnvironment.GetDosEnvCount: Word;

>   begin

>     Result := 0;

>     if Assigned(FDosEnvList) then Result := FDosEnvList.Count

>   end{GetDosEnvCount};

>   function TBDosEnvironment.GetDosEnvStr(Const Name: String): String;

>   var i: Integer;

>       Tmp: String;

>   begin

>     i := 0;

>     Result := '';

>     if Assigned(FDosEnvList) then while i do

>     begin

>       Tmp := FDosEnvList[i];

>       Inc(i);

>       if Pos(Name,Tmp) = 1 then

>       begin

>         Delete(Tmp,1,Length(Name));

>         if Tmp[1] = '=' then

>         begin

>           Delete(Tmp,1,1);

>           Result := Tmp;

>           i := FDosEnvList.Count { end while-loop }

>         end

>       end

>     end

>   end{GetDosEnvStr};

end.

Данный компонент получает список переменных среды во время своего создания. Свойство DosEnvCount и DosEnvList является свойством только для чтения и поэтому лучше его создавать его в на ходу, а не бросать на форму, так как берется только 'свежий' список переменных среды, а не загружается из .DFM файла).

2.2.4. Анализ

Среди переменных среды есть переменная с именем REQUEST_METHOD. Она должна иметь значение POST для нашего примера (Я не люблю другие методы). Затем мы должны найти размер информации, которая передана нам. Для этого мы должны получить переменную CONTENT_LENGTH. Сама информация поступает к нам через стандартный ввод (без маркера конца файла, поэтому наша задача не пытаться читать больше, чем нам передано). Данные поступающие через стандартный ввод имеют следующую форму FIELD=VALUE и разделяется с помощью символа '&'. Например: AUTHOR="Bob_Swart"&. Поскольку мы имеем весь входной поток, как одну длинную строку, то мы можем быстро найти параметр AUTHOR с помощью следующей функции: