Common Gateway Interface
CGI (Common Gateway Interface) - является
стандартом интерфейса (связи)
внешней прикладной программы с
информационным сервером типа HTTP, Web
сервер.
Обычно
гипертекстовые документы,
извлекаемые из WWW серверов,
содержат статические данные. С
помощью CGI можно создавать
CGI-программы, называемые шлюзами,
которые во взаимодействии с такими
прикладными системами, как система
управления базой данных,
электронная таблица, деловая
графика и др., смогут выдать на
экран пользователя динамическую
информацию.
Программа-шлюз
запускается WWW сервером в реальном
масштабе времени. WWW сервер
обеспечивает передачу запроса
пользователя шлюзу, а она в свою
очередь, используя средства
прикладной системы, возвращает
результат обработки запроса на
экран пользователя. Программа-шлюз
может быть закодирована на языках
C/C++, Fortran, Perl, TCL, Unix Schell, Visual Basic, Apple
Script. Как выполнимый модуль, она
записывается в поддиректорий с
именем cgi-bin WWW сервера.
Оригинал
описания CGI интерфейса -
инструмента связи программы-шлюз с
WWW сервером находится в узле wist.ifmo.ru
.
Для передачи данных об информационном запросе от сервера к шлюзу, сервер использует командную строку и переменные окружения. Эти переменные окружения устанавливаются в тот момент, когда сервер выполняет программу шлюза.
Информация шлюзам передается в следующей форме:
имя=значение&имя1=значение1&..,
где имя- имя переменной (из оператора FORM, например), и значение - ее реальное значение. В зависимости от метода, который используется для запроса, эта строка появляется или как часть URL (в случае метода GET), или как содержимое HTTP запроса (метод POST). В последнем случае, эта информация будет послана шлюзу в стандартный поток ввода.
На файловый дескриптор стандартного потока ввода посылается CONTENT_LENGTH байт. Так же сервер передает шлюзу CONTENT_TYPE (тип передаваемых данных). Сервер не обязан посылать символ конца файла после отсылки CONTENT_LENGTH байт данных и после того, как шлюз их прочитает.
Пример
Возьмем
результат работы формы с методом POST
(METHOD="POST") в качестве примера.
Пусть получено 7 байт,
закодированных примерно так:
a=b&b=c.
В этом случае, сервер установит значение CONTENT_LENGTH равным 7 и CONTENT_TYPE в application/x-www-form-urlencoded. Первым символом в стандартном потоке ввода для шлюза будет "a", за которым будет следовать остаток закодированной строки.
Шлюз в командной строке от сервера получает:
Ключевые слова, имена полей формы и значения передаются раскодированными (из HTTP URL формата кодирования) и перекодированными в соответствии с правилами кодирования Bourne shell, так что шлюз в командной строке получит информацию в том виде, как она есть, без необходимости осуществлять дополнительные преобразования.
Запросы оператора FORM
Запросы оператора FORM обрабатываются таким образом, что каждый параметр, отвечающий за имя поля, оканчивается знаком равенства, а остаток представляет собой значение этого параметра. Если присутствует что либо после имени скрипта (шлюза), то эта информация передается в качестве первого параметра. Иначе первый параметр будет пуст.
Примеры:
/htbin/foo/x/y/z?name1=value1&name2=value2
вызывается как:
/.../foo /x/y/z name1= value1 name2= value2
а
/htbin/foo?name1=value1&name2=value2
вызывается как:
/.../foo '' name1= value1 name2= value2
CGI переменные окружения
Следующие переменные окружения не являются специфичными по типу запросов и устанавливаются для всех запросов.
Следующие переменные окружения являются специфичными для разных запросов, и заполняются перед вызовом шлюза:
В дополнение к этим, если запрос содержит дополнительные поля заголовка запроса, они помещаются в переменные окружения с префиксом HTTP_, за которым следует имя заголовка. Любые символы '-' в заголовке меняются на символы подчеркивания '_'. Сервер может исключить любые заголовки, которые он уже обработал, такие как Authorization, Content-type, и Content- length. Если необходимо, сервер может исключить любые (или вообще все) дополнительные поля заголовка в случае, когда их включение может привести к превышению предела размера переменных окружения. Примером такой переменной может служить переменная HTTP_ACCEPT, которая была определена в спецификации CGI/1.0. Другим примером может служить заголовок User-Agent.
Основные концепции
Шлюз осуществляет свой вывод в стандартный поток вывода. Этот вывод может представлять собой или документ, сгенерированный шлюзом, или инструкции серверу, где получить необходимый документ.
Как
правило, шлюз производит свой
вывод, который интерпретируется и
посылается обратно клиенту.
Преимущество этого подхода состоит
в том, что шлюз не должен посылать
полный HTTP/1.0 заголовок на каждый
запрос.
Для некоторых шлюзов может быть необходимо избегать обработки сервером их вывода, и общаться с клиентом непосредственно. Для того, чтобы отличить такие шлюзы от остальных, CGI требует, чтобы их имена начинались с префикса nph-. В этом случае, на шлюзе лежит ответственность за возвращение клиенту синтаксически правильного ответа.
Заголовки с синтаксическим разбором
Вывод шлюза начинается с маленького заголовка. Он содержит текстовые строки, в том же формате, как и в HTTP заголовке и завершается пустой строкой (содержащей только символ перевода строки или CR/LF).
TO BE CONTINUED