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

       

CGI ввод


Теперь, мы знаем как создавать CGI приложение, которое может генерировать динамическую HTML страницу (или в действительности почти статическую). Но как  насчет ввода? Здесь более чем одно действие: мы должны проверять переменную DOS 'CONTENT LENGTH' что бы знать как много символов мы можем прочитать со стандартного ввода (если мы попытаемся читать больше чем есть, то мы повиснем навсегда). Конечно, это широко известный факт. Я написал компонент TBDosEnvironment чтобы вы могли иметь доступ до переменных среды DOS:

 unit DrBobDOS;

 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;



     procedure

DoNothing(const Value: TStringList);

   protected

   { Protected method declarations }

     Dummy: Word;

     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.

     }

   published

   { Published design declarations }

     property

DosEnvCount: Word read

GetDosEnvCount write Dummy;

     property

DosEnvList: TStringList read

FDosEnvList write DoNothing;

   end;

 implementation

   constructor

TBDosEnvironment.Create(AOwner: TComponent);

   var

     P: PChar;

   begin

     inherited

Create(AOwner);

     FDosEnvList := TStringList.Create;

   {$IFDEF WIN32}

     P := GetEnvironmentStrings;

   {$ELSE}

     P := GetDosEnvironment;

   {$ENDIF}

     while

P^ <> #0 do

     begin

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

   procedure

TBDosEnvironment.DoNothing(const

Value: StringList);

   begin

   end {DoNothing};

   function

TBDosEnvironment.GetDosEnvCount: Word;

   begin

     if Assigned(FDosEnvList) then

       Result := FDosEnvList.Count

     else

       Result := 0;

   end {GetDosEnvCount};

   function

TBDosEnvironment.GetDosEnvStr(const

Name: String): String;

   var

     i: Integer;

     Tmp: String;

   begin

     i := 0;

     Result := '';

     if Assigned(FDosEnvList) then while

i < FDosEnvList.Count 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.

Здесь список переменных среды (предоставленный Deepak Shenoy), которые доступны для CGI программ. Даже ISAPI программы могут использовать эти переменные:

Environment Variable

Purpose/Meaning/Value

GATEWAY_INTERFACE 

Версия CGI для которой скомпилирован web сервер

SERVER_NAME

IP адрес сервера или имя.

SERVER_PORT

Порт на сервер, которые принимает HTTP запросы.

SERVER_PROTOCOL

Имя и версия протокола, используемая для обработки запросов.

SERVER_SOFTWARE

Имя (и обычно версия) программного обеспечения сервера.

AUTH_TYPE

Схема проверки прав используемая сервером (NULL , BASIC)

CONTENT_FILE

Файл используемый для передачи данных CGI программе (только Windows HTTPd/WinCGI).

CONTENT_LENGTH

Количество байтов переданное на стандартный вход (STDIN) как содержимое POST запроса.

CONTENT_TYPE

Тип данных переданных на сервер.

OUTPUT_FILE

Имя файла для результата (только Windows HTTPd/WinCGI).

PATH_INFO

Дополнительный, относительный путь переданный на сервер после имени скрипта, но до данных запроса.

PATH_TRANSLATED

Та же самая информация, но преобразованная из относительного пути в абсолютный.

QUERY_STRING

Данные переданные как часть URL, все после символа ? в URL.

REMOTE_ADDR

Адрес IP или имя сервера конечного пользователя.

REMOTE_USER

Имя пользователя, если используется схема проверки прав.

REQUEST_LINE

Полный HTTP запрос представляемый сервером (зависит от сервера).

REQUEST_METHOD

Указывает метод передачи данных, как часть URL (GET) или через стандартный ввод STDIN (POST).

SCRIPT_NAME

Имя запущенного скрипта.

<


Немного еще дополнительной, но важной информации. Немного об переменных среды, которые особо важны для обработки запроса, и небольшое описание по обработке стандартных CGI приложений:

REQUEST_METHOD - указывает, как посланы данные, как POST или как GET метод.

QUERY_STRING - если используется GET

CONTENT_LENGTH - если мы используем POST, то мы должны прочитать "CONTENT_LENGTH" символов со стандартного ввода (которые оканчиваются "Query", подобно QUERY_STRING при использовании метода GET).

Во всех случаях стандартное CGI приложение должно писать свой вывод на стандартный выход, если мы используем консольное приложение.

Теперь с помощью компонента TBDosEnvironment мы создадим приложение, которое примет все три переменных среды, описанных выше и получит необходимые данные. После этого мы напишем код генерирующий вывод.

Правда просто? Для другого очень маленького  (39 Кб) стандартного CGI приложения, проверьте Search Engine на моем web сайте. Краткий исходный код будет опубликован в одной из статей в The Delphi Magazine, но я могу сказать, что базовый протокол CGI связи не более сложный, чем представленный здесь.


Содержание раздела