Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции / !!! ИТ Архив / Лекции / 5_C G I / Лекция 2 - Обзор CGI.doc
Скачиваний:
28
Добавлен:
04.04.2013
Размер:
169.47 Кб
Скачать

Пересылка бинарных данных

Генерируемые CGI-приложениями ответы не обязательно должны содержать только текстовые данные. Данный пример демонстрирует возможность получения в качестве ответа бинарных данных, например изображений. Предполагается, что в каталоге с CGI-приложением размещается изображение в формате GIF, которое пользователь увидит в браузере при обращении к серверу.

const

image_file = 'test.gif';

var

fh : file of char;

buf : char;

image_size : longint;

begin

assign( fh, image_file );

reset( fh );

writeln( 'Content-Type: image/gif' );

writeln( 'Content-Length: ', filesize( fh ) );

writeln;

while not eof( fh ) do

begin

read( fh, buf );

write( buf );

end;

close( fh );

end.

Первоначально, в выходной поток выдается заголовок Content-Type c указанием о MIME-типе данных, в нашем случае это image/gif. После этого вычисляется размер бинарных данных, для чего используется функция filesize(). Указанная функция возвращает размер передаваемого файла в байтах. Эта информация передается в выходной поток в заголовке Content-Length. Далее следует предусмотренная стандартом одинарная пустая строка. Затем для чтения открывается файл с изображением, и производится побайтовая перепись его в выходной поток.

Подобным образом могут быть переданы любые бинарные данные. Важно, чтобы был правильно указан MIME-тип и количество данных. Для обозначения бинарных данных неизвестного типа часто используется MIME-тип application/octet-stream.

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

Основная часть информации, необходимой программам CGI, передается им через переменные среды ОС UNIX. Программы могут обрабатывать эту информацию так же, как и значение любой переменной среды (например, посредством ассоциативного массива %ENV в Perl). В приведенной ниже таблице перечислены переменные среды, обычно используемые в CGI. Следует отметить, однако, что поскольку на разных серверах имена переменных среды, используемых для присвоения значений, могут различаться, то необходимо обязательно проверить эти имена в документации на конкретный сервер.

Переменная среды

Возвращаемое содержимое

AUTH_TYPE

Метод аутентификации пользователя. См. REMOTE_USER и REMOTE_IDENT.

CONTENT_LENGTH

Длина (в байтах или знаках) данных запроса, передаваемых в программу CGI через стандартный ввод.

CONTENT_TYPE

Медиа-тип данных запроса, например text/html.

DOCUMENT_ROOT

Корневой каталог дерева документов сервера.

GATEWAY_INTERFACE

Версия интерфейса Common Gateway Interface, с которой работает пользователь.

НТTР_АССЕРТ

Перечень медиа-типов, которые может принимать клиент.

HTTP_FROM

Адрес электронной почты пользователя, направившего запрос (во многих браузерах эта переменная не поддерживается).

HTTP_REFERER

URL документа, на который клиент указывает перед обращением к программе CGI.

HTTP_USERAG_ENT

Браузер, которым клиент пользуется для выдачи запроса.

PATH_INFO

Дополнительная информация о пути, передаваемая в программу CGI.

PATH_TRANSLATED

Конвертированная версия пути, заданного в переменной PATH_INFO.

QUERY_STRING

Информация о запросе, переданная в программу. Для присоединения этой информации к URL используется знак "?".

REMOTE_ADDR

Удаленный IP-адрес, с которого пользователь посылает запрос.

REMOTE_HOST

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

REMOTE_IDENT

Идентификатор пользователя, посылающего запрос.

REMOTE_USER

Аутентифицированное имя пользователя, посылающего запрос.

REQUEST_METHOD

Метод, который использовался для выдачи запроса (например, GET, POST, HEAD).

SCRIPT_NAME

Имя выполняемого сценария (например, /cgi-bin/program.pl).

SERVER_NAME

Хост-имя или IP-адрес сервера.

SERVER_PORT

Номер порта хост-машины, на которой работает сервер.

SERVER_PROTOCOL

Имя и версия информационного протокола, который был использован для запроса.

SERVER_SOFTWARE

Имя и версия программного обеспечения сервера, которое отвечает на запрос клиента.

Ниже приведен пример простого CGI-сценария на языке Pascal, в котором переменные среды используются для выдачи на экран дисплея различной информации о сервере:

uses Dos;

var VarId: Integer;

begin

Writeln('Content-Type: text/html');

Writeln;

Writeln('<html><body>');

for VarId := 1 to EnvCount do

begin

Writeln( EnvStr(VarId), '<br>');

end;

Writeln('</body></html>');

end.

Эта программа передает содержимое пяти переменных среды в HTML-документ. Библиотека Dos содержит все необходимые функции для получения переменных среды, в частности, EnvCount содержит количество переменных, а функция EnvStr() позволяет получить строку, содержащую имя переменной и ее значение по индексу. Формат стоки, возвращаемый EnvStr() следующий “имя_параметра = значение”.

Ниже приведен типичный пример выходных данных такой программы:

HTTP_ACCEPT_CHARSET=ISO-8859-1,utf-8;q=0.7,*;q=0.7

HTTP_ACCEPT_ENCODING=gzip,deflate

HTTP_ACCEPT_LANGUAGE=en-us,en;q=0.5

HTTP_CONNECTION=keep-alive

HTTP_HOST=localhost

HTTP_KEEP_ALIVE=300

HTTP_USER_AGENT=Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.6) Gecko/20040206 Firefox/0.8

REMOTE_ADDR=127.0.0.1

REMOTE_PORT=1344

SCRIPT_FILENAME=e:/program files/apache/cgi-bin/penv.exe

SERVER_ADDR=127.0.0.1

SERVER_NAME=localhost

SERVER_PORT=80

SERVER_SIGNATURE=Apache/1.3.12 Server at localhost Port 80

SERVER_SOFTWARE=Apache/1.3.12 (Win32) PHP/4.0.6

SYSTEMROOT=E:\WINNT GATEWAY_INTERFACE=CGI/1.1

SERVER_PROTOCOL=HTTP/1.1

REQUEST_METHOD=GET

QUERY_STRING=

REQUEST_URI=/cgi-bin/penv.exe

SCRIPT_NAME=/cgi-bin/penv.exe