С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; Мы поможем в написании вашей работы! |
Мы поможем в написании ваших работ!