Вот код нашего первого "Hello, world!" CGI приложения:
programCGI1;
{$APPTYPE CONSOLE}
begin
writeln('content-type: text/html');
writeln;
writeln('
writeln('
writeln('Hello, world!');
writeln('
writeln('
end.
Если вы откомпилируете данную программу в Дельфи 2 или 3 и затем запустите ее из web браузера подключенного к web серверу, где оно записано в исполнимом виде в исполняемом каталоге таком как cgi-bin, то вы увидите текст "Hello, world!" на странице.
Теперь, мы знаем как создавать CGI приложение, которое может генерировать динамическую HTML страницу (или в действительности почти статическую). Но как насчет ввода ? Здесь более чем одно действие: мы должны проверять переменную DOS 'CONTENT LENGTH' что бы знать как много символов мы можем прочитать со стандартного ввода (если мы попытаемся читать больше чем есть, то мы повиснем навсегда). Конечно, это широко известный факт. Я написал компонент TBDosEnvironmentчтобы вы могли иметь доступ до переменных среды DOS:
unitDrBobDOS;
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;
procedureDoNothing( constValue: TStringList);
protected
{ Protected method declarations }
Dummy: Word;
functionGetDosEnvCount: Word;
public
{ Public interface declarations }
functionGetDosEnvStr( constName: String): String;
{ This function is a modified version of the GetEnvVar function thatappears in the WinDos unit that comes with Delphi. This function's interface uses Pascal strings instead of null-terminated strings.
}
published
{ Published design declarations }
propertyDosEnvCount: Word readGetDosEnvCount writeDummy;
propertyDosEnvList: TStringList readFDosEnvList writeDoNothing;
end;
implementation
constructorTBDosEnvironment.Create(AOwner: TComponent);
var
P: PChar;
begin
inheritedCreate(AOwner);
FDosEnvList := TStringList.Create;
{$IFDEF WIN32}
P := GetEnvironmentStrings;
{$ELSE}
P := GetDosEnvironment;
{$ENDIF}
whileP^ <> #0 do
begin
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} ;
procedureTBDosEnvironment.DoNothing( constValue: StringList);
begin
end {DoNothing} ;
functionTBDosEnvironment.GetDosEnvCount: Word;
begin
ifAssigned(FDosEnvList) then
Result := FDosEnvList.Count
else
Result := 0;
end {GetDosEnvCount} ;
functionTBDosEnvironment.GetDosEnvStr( constName: String): String;
var
i: Integer;
Tmp: String;
begin
i := 0;
Result := '';
ifAssigned(FDosEnvList) then whilei < FDosEnvList.Count 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.
Здесь список переменных среды (предоставленный 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 приложений:
Читать дальше