
- •Обзор cgi
- •Пример взаимодействия с cgi
- •Пересылка данных формы
- •Кодирование url
- •Дополнительная информация о пути
- •Создание виртуальных документов
- •Пересылка бинарных данных
- •Переменные среды
- •Разбор параметров запроса
- •Поля пароля
- •Поля выбора файла
- •Селекторные кнопки
- •Кнопки передачи
- •Скрытые поля
- •Пример формы
Пересылка бинарных данных
Генерируемые 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