Сommon Gateway Interface -средство расширения возможностей технологии World Wide Web



Спецификация CGI была разработана в Центре суперкомпьютерных приложений университета штата Иллинойс (NCSA). Работы над ней велись параллельно с Mosaic. С точки зрения общей архитектуры программного обеспечения World Wide Web CGI определила все дальнейшее развитие системных средств. До появлени этой cпецификации все новые возможности реализовывались в виде модулей,включенных в библиотеку общих кодов ЦЕРН. Разработчики серверов должны были использовать эти коды для реализации программ или заменять их своими собственными аналогами. Это означало, что после компиляции сервера добавить в него новые возможности будет невозможно. CGI в корне изменила эту практику.

Главное назначение Common Gateway Interface - обеспечение единообразного потока данных между сервером и прикладной программой, которая запускается из-под сервера. CGI определяет протокол обмена данными между сервером и программой. Для тех, кто знаком с протоколом HTTP, может показаться, что CGI - это просто подмножество этого протокола. Однако это не так. Во-первых, CGI определяет порядок взаимодействия сервера с прикладной программой, в котором сервер выступает инициирующей стороной, во-вторых, CGI определяет механизм реального обмена данными и управляющими командами в этом взаимодействии,что не определено в HTTP. Естественно, что такие понятия, как метод доступа,переменные заголовка, MIME, типы данных, заимствованы из HTTP и делают спецификацию прозрачной для тех, кто знаком с самим протоколом.

При описании различных программ, которые вызываются сервером HTTP и реализованы в стандарте CGI, используют следующую терминологию:

CGI-скрип - программа, написанная в соответствии со спецификацией Common Gateway Interface. CGI-скрипты могут быть написаны на любом языке программи- рования (С, C++, PASCAL, FORTRAN и т.п.) или командном языке (shell, cshell, командный язык MS-DOS, Perl и т.п.). Скрипт может быть написан даже на языке редактора ЕМАС в системах Unix.

Шлюз - это CGI-скрипт, который используется для обмена данными с другими информационными ресурсами Internet или приложениями-демонами. Обычная CGI-программа запускается сервером HTTP для выполнения некоторой работы, возвращает результаты серверу и завершает свое выполнение. Шлюз выполняется точно также, только фактически он инициирует взаимодействие в качестве клиента с третьей программой. Если эта третья программа является сервисом Internet, например, сервер Gopher, то шлюз становится клиентом Gopher, который посылает запрос по порту Gopher, а после получения ответа пересылает его серверу HTTP.

Аналогично происходит взаимодействие с серверами распределенных баз данных, например, Oracle.

Механизмы обмена данными

Собственно спецификация CGI описывает четыре набора механизмов обмена данными:

· через переменные окружения;

· через командную строку;

· через стандартный ввод;

· через стандартный вывод.

Переменные окружения.При запуске внешней программы сервер создает специфические переменные окружения, через которые передает приложении как служебную информацию, так и данные. Все переменные можно разделит на общие переменные окружения, которые генерируются при любой форме запроса, и запрос ориентированные переменные.

К общим переменным окружения относятся:

· SERVER_SOFTWARE - определяет имя и версию сервера.

· SERVER_NAME - определяет доменное имя сервера.

· GATEWAY_INTERFACE - определяет версию интерфейса.

К запрос-ориентированным относятся:

· SERVER_PROTOCOL - протокол сервера. Вообще говоря, CGI разрабатывалась не только для применения в World Wide Web с протоколом HTTP, но и для других протоколов также, но широкое применение получила только в WWW.

· SERVER_PORT - определяет порт TCP, по которому осуществляется взаимодействие. По умолчаниюдля работы по HTTP используется 80 порт, но он может быть и переназначен при конфигурировании сервера.

· REQUEST_METHOD - определяет метод доступа к информационному ресурсу. Это важнейшая переменная в CGI. Разные методы доступа используют различные механизмы передачи данных. Данная переменная может принимать значения GET, POST, HEAD и т. п.

· PATH_INFO - передает расширение пути к информационному ресурсу.Например, в запросе http://144.206.192.100/cgi-bin/test?kuku расширение пути - это "kuku" и PATH_INFO-kuku.

· PATH_TRANSLATED - полный путь к ресурсу. Дело в том, что при конфигури- ровании сервера некоторым элементам (ветвям) дерева файловой системы можно назначить синонимы. Типичным примером такого сорта является назначение типа:

cgi-bin ------------> /usr/local/etc/httpd/cgi-bin

В данном случае справа указано стандартное место CGI-скриптов для сервера NCSA, а слева - его синоним. При получении скриптом test управления клиент передает значение

"/cgi-bin/test"

а в PATH_TRANSLATED -

" /usr/local/etc/httpd/cgi-bin/test".

· SCRIPT_NAME - определяет адрес скрипта так, как он указан клиентом. Если не указаны параметры, то значение этой переменной будет совпадать с тем, что клиент передает в качестве пути, но если переменные указаны, то все, что следует за знаком "?", будет отброшено.

SCRIPT_NAME----------->"/cgi-bin/search"

· QUERY_STRING - переменная определяет содержание запроса к cкрипту.Чрезвычайно важна при использовании метода доступа GET. Возвращаясь к примеру с адресами скрипта, укажем, что в QUERY_STRING помещается все, что записано после символа "?".

QUERY_STRING -------> "nuclear+isotop"

При этом никакого преобразования строки запроса сервером не производится. Все манипулирования с содержанием QUERY_STRING возложены на скрипт.

Следующий набор переменных связан с идентификацией пользователя и его машины:

· REMOTE_HOST - доменный адрес машины, с которой осуществляется запрос.

· REMOTE_ADDR - IP-адрес запрашивающей машины.

· AUTH_TYPE - тип идентификации пользователя. Используется в случае, если скрипт защищен от несанкционированного использования.

· REMOTE_USER - используется для идентификации пользователя.

· REMOTE_IDENT - данная переменная порождается сервером, если он поддерживает идентификацию пользователя по протоколу RFC-931. Рекомендовано использование этой переменной для первоначального использования скрипта.

Следующие две переменные определяют тип и длину передаваемой информации от клиента к серверу.

· CONTENTS_TYPE - определяет MIME-тип данных, передаваемых скрипту.Используя эту переменную, можно одним скриптом обрабатывать различные форматы данных.

· CONTENT_LENGTH - определяет размер данных в байтах, которые передаются скрипту. Данная переменная чрезвычайно важна при обмене данными по методу POST, т, к. нет другого способа определить размер данных, которые надо прочитать со стандартного ввода

Возможна передача и других переменных окружения. В этом случае перед именем указывается префикс "НТТР_".Отдельный случай представляют переменные, порожденные в заголовке HTML-документа в тагах МЕТА. Они передаются в заголовке сообщения, и некоторые серверы могут порождать переменные окружения из этих полей заголовка.

Опции командной строки.Командная строка используется только при запросах типа ISINDEX. При HTML FORMS или любых других запросах неопределен- ного типа командная строка не используется. Если сервер определил,что к скрипту обращаются через ISINDEX-документ, то поисковый критерий выделяется из URL и преобразуется в параметры командной строки. При этом знаком разделения параметров является символ "+".Тип запроса определяется по наличию или отсутствию символа "=" в запросе.Если этот символ есть, то запрос не является запросом ISINDEX, если символа нет, то запрос принадлежит к типу ISINDEX. Параметры, выделенные из запроса,помещаются в argv[l...]. При этом из выделения происходит преобразование всех шестнадцатеричных символов в их ASCII-коды. Если число параметров превышает ограничения, установленные в командном языке, например в shell, то формирования командной строки не происходит и данные передаются только через QUERY_ STRING. Вообще говоря, следует заранее подумать об объеме данных, передаваемом скрипту, и выбрать соответствующий метод доступа. Размер переменных окружения тоже ограничен, и если необходимо передавать много данных, то лучше сразу выбрать метод POST, т.е. передачу данных через стандартный ввод.

Формат стандартного ввода.Стандартный ввод используетсяпри передачи данных в скрипт по методу POST. Объем передаваемых данных задается пере- менной окружения CONTENT_LENGTH, а тип данных - переменной CONTEN_TYPE. Если из HTML-формы надо передать запрос типа:a=b&b=c, то CONTENT_LENGTH=7, ONTENT_TYPE=appli-cation/x-www-form-urlencod-ed,а первым символом в стан дартном вводе будет символ "а". Следует всегда помнить, что конец файла сервером в скрипт не передается, а поэтому завершать чтение следует по числу прочитанных символов. Позже мы разберем примеры скриптов и обсудим особенности их реализации в разных операционных системах.

Формат стандартного вывода.Стандартный вывод используется скриптом для возврата данных серверу. При этом вывод состоит из заголовка и соб- ственно данных. Результат работы скрипта может передаваться клиенту без каких-либо преобразований со стороны сервера, если скрипт обеспечивает построение полного HTTP-заголовка, в противном случае сервер заголовок модифицирует в соответствии со спецификацией HTTP. Заголовок сообщения должен отделяться от тела сообщения пустой строкой. Обычно в скриптах указывают только три поля HTTP-заголовка:

Content-type, Location, Status.

Content-type указывается в том случае, когда скрипт сам генерирует документ "на лету" и возвращает его клиенту. В этом случае реального документа в файловой системе сервера не остается. При использовании такого сорта скриптов следует учитывать, что не все серверы и клиенты отрабатывают так, как представляется разработчику скрипта. Так при указании Content-type:text/ html, некоторые клиенты не реализуют сканирования полученного текста на предмет наличия в нем встроенной графики. Обычно в Content-type указывают текстовые типы text/plain и text/html.

Location используется для переадресации. Иногда переадресация помогает преодолеть ограничения сервера или клиента на обработку встроенной графики или серверной предобработки. В этом случае скрипт создает файл на диске и указывает его адрес в Location. Сервер, таким образом, передает реально существующий файл. В последнее время серверы стали буферизовать возвращаемые клиентам данные, что приводит к решению вопросов, связанных с повторным запуском скриптов для встраивания графики и разгрузки компьютера с сервером HTTP.


Дата добавления: 2018-04-05; просмотров: 195; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!