37355

Средства и технологии разработки приложений Windows CGI

Курсовая

Информатика, кибернетика и программирование

Протокол CGI - Common Gateway Interface служит для связи веб-сервера с другими программами. На его основе работают гостевые книги, форумы, интернет-магазины и любые другие интерактивные сайты. Заполняя HTML-форму на сайте, нажимая кнопку Отправить, после чего обозреватель передает данные веб-серверу

Русский

2013-09-24

91.1 KB

3 чел.

Национальный авиационный университет

Факультет компьютерных систем

Кафедра компьютерных систем управления

Курсовая работа

на тему:

«Средства и технологии разработки приложений Windows CGI»

выполнила:

Студентка гр. ФКС-406

Смоляр Екатерина

Научный руководитель:

доцент

кандидат технических наук

Нестеренко Борис Николаевич

Киев – 2012

Зміст

1 Ввод

2 Основные теоретические сведенья

2.1 Предназначение интерфейса CGI

2.2 Метод запроса GET, POST

2.3 Секциии CGI

3 Вызов CGI программ

4 Использование CGI

4.1  Конфигурирование сервера для CGI

4.2 Установка CGI на серверах UNIX, Windows, Macintosh

4.3 Спецификация CGI

5 Список используемой литературы

6 Вывод

2.1 Предназначение интерфейса CGI

Протокол CGI - Common Gateway Interface служит для связи веб-сервера с другими программами. На его основе работают гостевые книги, форумы, интернет-магазины и любые другие интерактивные сайты. Заполняя HTML-форму на сайте, нажимая кнопку "Отправить", после чего обозреватель передает данные веб-серверу. Веб-сервер запускает соответствующую программу и передает ей данные, полученные от вашего Интренет-обозревателя. Программа на основе этих данных формирует HTML-страницу и возвращает ее веб-серверу. Веб-сервер, в свою очередь, возвращает эту страницу обозревателю. При этом, программа может обращаться к базе данных или запустить другие программы на сервере. Программа может быть как исполняемым файлом, написанным на языках С\С++, Pascal, Assembler и др., так и скриптом на языке Perl или UNIX-shell.(рис.1-2)

   

Рис.2

Отличия от сервера терминалов здесь в том, что пользовательский интерфейс предоставляется в виде веб-страниц. Запросы веб-клиентов, обращенные к программам, размещенным в выделенном каталоге (как правило cgi или cgi-bin) перенаправляются на их вход через стандартный поток ввода (stdin). Результаты выполнения в виде гипертекста приложение возвращает веб-серверу через stdout.

CGI–функции могут быть реализованы на сервере в двух вариантах: в форме CGI-сценариев (CGI scripts) и в виде CGI приложений. CGI приложения представляют собой исполнимые модули, вызываемые Web-сервером. Схема взаимодействия между броузером, сервером и CGI-модулем приводится на рисунке3. По своей структуре CGI приложение является обычной консольной программой. Сервер передает данные CGI приложению через переменные окружения и стандартный поток ввода, а CGI приложение передает данные серверу через свой стандартный поток вывода. Сервер запускает новую копию приложения для обработки каждого запроса. По окончании обработки запроса CGI-приложение завершается.

Предположим, нужно набрать в браузере http://www.server.com/path/pict.gif

После введенного http-запроса сервер отсылает апрошенную картинку формата GIF (конечно, если она доступна по указанному адресу). Однако сказать, что запросили именно картинку нельзя. Почему? Дело в том, что файл pict.gif может не быть картинкой и даже вообще не существовать. А это ни что иное, как проявление CGI. Во-первых файл pict.gif и путь /path/ могут не существовать, поскольку администратор web-сервера может настроить псевдонимы для данного объекта на сервере. Во-вторых, файл pict.gif может сформировать CGI-программа "на лету", передав в браузер готовую картинку в формате GIF. Вот именно в таком случае были использованы средства CGI. Данный механизм абсолютно незаметен для пользователя ресурса, которому все равно, каким образом в его браузере появилась картинка - браузер передал файл или файл передала программа. Подобным образом можно передавать и html-документы, в таком случае они могут формироваться программой динамически и передаваться браузерам пользователей в ответ на их запросы.

Например, нужно, чтобы в каком-то документе проставлялись текущая дата и время. Разумеется, мы не можем заранее прописать их в документе — ведь в зависимости от того, когда он будет загружен пользователем, эта дата должна меняться. Зато мы можем написать сценарий (скрипт), который вычислит дату, вставит ее в документ и затем передаст его пользователю! Однако в построенной нами модели не хватает одного звена. Действительно, предположим, нам нужно, чтобы время в нашей странице проставлялось на основе часового пояса пользователя. Но как сценарий узнает, какой часовой пояс у региона, в котором живет этот человек (или какую-нибудь другую информацию, которую может предоставить пользователь)? Видимо, должен быть какой-то механизм, который позволит пользователю не только получать, но также и передавать информацию серверу (в данном случае, например, поправку времени в часах относительно Киева). Это также обеспечивает CGI.

Предназначение интерфейса CGI

Интерфейс CGI выполняет функции шлюза между различными программами, установленными на web-сервере, и браузерами пользователей. Когда браузер запрашивает определенный ресурс, web-сервер запускает программу, которая уже возвращает результат в браузер пользователя. Использование CGI-программ требуется, когда необходимо в браузере пользователя отобразить страницу, сформированную на основе каких-либо действий пользователя. Например, вы ввели в форму какие-либо данные, а на их основе формируется посылаемая вам страница. CGI-программа может также определить IP-адрес ващего компьютера в сети, и на основе его определить вашу страну, в итоге передав вам html-документ на вашем родном языке!

Механизм CGI перенаправляет вывод программы на web-сервер, а тот, в свою очередь, в браузер пользователя. С точки зрения программы нет ничего необычного - она лишь выводит информацию. Абсолютно любая программа не может быть CGI-прграммой, потому что перед своим выводом она должна вывести определенные заголовки сервера - указать хотя бы тип выводимой информации. Например, если мы хотим вывести картинку, мы должны отправить заголовок Content-type: image/gif. Если CGI-программе нужно передать параметры, то делается это очень просто - как и в случае с обычной программой. Например, нам нужно передать строку запроса name=Kateryna&email=kateryna@smoliar.com сценарию cgi.exe. Для этого необходимо вызвать программу cgi.exe с указанной строкой запроса: cgi.exe name=Kateryna&email=kateryna@smoliar.com.

Разделяют параметры с помощью символа &. Когда на странице несколько полей ввода и переключателей, а под ними кнопка "Отправить"Это и есть форма, с ее помощью можно автоматизировать процесс передачи данных сценарию. Разумеется, сценарий опять же должен адекватно среагировать на эти параметры: провести разбор строки, создать переменные и.т.д. Следует обратить внимание на то, что все эти действия придется программировать вручную, воспользоваться языком Си. PHP разбирает параметры строки запроса самостоятельно.

2.2 Метод запроса GET, POST

Так вот, такой способ посылки параметров сценарию (когда данные помещаются в командную строку URL) называется методом GET. Фактически, даже если не передается никаких параметров (например, при загрузке статической страницы), все равно применяется метод GET. Однако, существует еще один распространенный способ — передача пераметров запроса методом POST.

Метод запроса GET

Формат запроса: GET сценарий параметры HTTP/1.0

>>> Переменные окружения: REQUEST_URI; в переменной QUERY_STRING сохраняется значение и параметры, в переменной REQUEST_METHOD — ключевое слово GET.

Этот заголовок является обязательным (если только не применяется метод POST) и определяет адрес запрашиваемого документа на сервере. Также задаются параметры, которые пересылаются сценарию (если сценарию ничего не передается, или же это обычная статическая страница, то все символы после знака вопроса и сам знак опускаются). Вместо строки HTTP/1.0 может быть указан и другой протокол - например, HTTP/1.1. Именно его соглашения и будут учитываться сервером при обработке данных, поступивших от пользователя, и других заголовков.

Строка сценарий, параметры задается в том же самом формате, в котором она входит в URL. Неплохо было бы назвать эту строку как-нибудь более реалистично, чтобы учесть возможность присутствия в ней командных параметров. Такое название действительно существует и звучит как URI (Universal Resource Identifier - Универсальный идентификатор ресурса). Очень часто его смешивают с понятием URL (вплоть до того, что это происходит даже в официальной документации по стандартам HTTP). Под словом URL мы понимаем полный путь к некоторой Web-странице вместе с параметрами, а URI - это его часть, расположенная после имени (или IP-адреса) хоста и номера порта.

Метод запроса POST

Формат запроса: POST сценарий параметры HTTP/1.0

>>> Переменная окружения: REQUEST_URI; в переменной QUERY_STRING сохраняется значение и параметры, в переменной REQUEST_METHOD — слово POST.

Настал момент рассмотреть метод POST. Приведем сразу практический пример метода запроса POST:

POST /script.cgi HTTP/1.0\n

Content-length: 6\n

\n

Hello!

Сервер начнет обработку запроса, не дожидаясь передачи данных после маркера конца заголовков. Иными словами, сценарий запустится сразу же после отправки \n\n, а уж ждать или не ждать, пока придет строка Hello! длиной 6 байт. Сервер не интерпретирует POST-данные (точно так же, как он не интерпретирует некоторые заголовки), а пересылает их непосредственно сценарию. Но как же сценарий узнает, когда данные кончаются, т. е. когда ему прекращать чтение информации, поступившей от браузера. В этом ему поможет переменная окружения Content-Length, и именно на нее следует ориентироваться.

Зачем нужен метод POST? В основном для того, чтобы передавать большие объемы данных. Например, при загрузке файлов через Web или при обработке больших форм. Кроме того, метод POST часто используют для эстетических целей: дело в том, что при применении GET, URL сценария становится довольно длинным и неизящным. Переданные сценарию параметры не отображаются в окне браузера, POST-запрос оставляет URL без изменения.

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

CGI файл данных состоит из следующих секций:

  1.  [CGI]
  2.  [Accept]
  3.  [System]
  4.  [Extra Headers]
  5.  [Form Literal]
  6.  [Form External]
  7.  [Form Huge]
  8.  [Form File]

Секция [CGI]

Данная секция содержит большинство специфических CGI параметров (тип доступа, тип запроса, дополнительные заголовки, определенные в других секциях и т.п.). Каждое значение представлено в виде символьной строки. Если значение является пустой строкой, значит данный параметр был опущен. Список параметров данной секции представлен ниже:

Request Protocol

Название и модификация информационного протокола, использованного для передачи данного запроса. Формат: протокол/модификация. Пример: "HTTP/1.0".

Request Method

Метод, который использовался для данного запроса. Для HTTP это "GET", "HEAD", "POST" и т.д.

Executable Path

Логический путь к исполняемой CGI программе, необходимый для ссылки CGI программе на саму себя.

Logical Path

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

Physical Path

Если запрос содержит информацию о логическом пути, сервер преобразует его к физическому пути (например, к пути к файлу на диске) доступа согласно синтаксическим правилам операционной системы.

Query String

Информация, размещающаяся после ? в URL вызываемой CGI программы. Сервер оставляет эту информацию без изменений в том виде, в котором она была помещена в URL.

Request Range

Byte-range спецификация получаемая вместе с запросом (если есть). Смотри текущий Internet Draft (или RFC), описывающий расширение HTTP для получения более полной информации. Сервер должен поддерживать работу CGI программ в byte-ranging.

Referer

URL документа, содержащего ссылку на данную CGI программу. Надо заметить, что некоторые броузеры закрывают данную возможность и не дают ее использовать.

From

E-mail адрес пользователя броузера. Надо заметить, что данный параметр присутствует с спецификации HTTP, но не используется большинством броузером из соображений секретности.

User Agent

Строка, описывающая программное обеспечение броузера. Не генерируется большинством броузеров.

Content Type

Данный параметр содержит MIME-тип данных, посланных клиентом вместе с полями из формы, если эти данные были посланы. Формат: type/subtype.

Content Length

Для запросов, с которыми посланы дополнительные данные в это поле заносится длина посланных данных в байтах.

Content File

Для запросов, содержащих дополнительные данные, посланные пользователем, этот параметр содержит имя файла, в которое WEB-сервер записывает эти данные. В дальнейшем, пользовательская программа может считать эти данные. Параметр содержит полный путь к файлу данных.

Server Software

Название и версия серверного программного обеспечения, обработавшего запрос и вызвавшего CGI-программу. Формат: name/version.

Server Name

Сетевое имя сервера или псевдоним, необходимый для ссылающихся на себя URL Этот параметр (в комбинации с параметром ServerPort) может быть использован для вычисления полного URL к серверу.

Server Port

Номер порта, по которому работает сервер.

Server Admin

E-mail адрес администратора сервера. Данный параметр необходим для генерации сообщений об ошибках и отправки данных сообщений администратору сервера или для генерации форм с URL "mailto:".

CGI Version

Версия спецификации CGI. Формат: CGI/версия. Для данной версии, "CGI/1.2 (Win)".

Remote Host

Сетевое имя хоста клиента, если доступно. Данный параметр может быть использован для опознавание клиента.

Remote Address

Сетевой (IP) адрес клиента. Данный параметр может быть использован для проверки пользователя если отсутствует сетевое имя.

Authentication Method

Если используется защищенный вызов CGI программы, это протокол-зависимый метод аутентификации, используемый для аутентификации пользователя.

Authentication Realm

Если используется защищенный вызов CGI программы, это протокол-зависимый сервис, используемый для аутентификации пользователя. Список пользователей для полученного вида сервиса проверяется для аутентификации пользователя.

Authenticated Username

Если используется защищенный вызов CGI программы, это имя пользователя, которое клиент использует для аутентификации при доступе к CGI-программе.

Секция [Accept]

Данная секция содержит типы данных, посылаемых клиентом, найденные в заголовке запроса в виде

Accept: type/subtype {parameters}

Если данные параметры присутствуют (например, "q=0.100") , они передаются как значения параметра Accept. Для каждого типа передаваемых данных заводится свой параметр Accept.

Секция [System]

Данная секция содержит параметры, специфические для Windows реализации CGI:

GMT Offset

Количество секунд, которое необходимо добавить к времени по Гринвичу для вычисления локального времени клиента.

Debug Mode

Данный параметр имеет значение "Yes" если включен режим "CGI/script tracing" на сервере.

Output File

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

Content File

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

Секция [Extra Headers]

Данная секция содержит "дополнительные" заголовки, которые включены в запрос в виде "параметр=значение". Сервер должен раскодировать как параметр, так и его значение прежде чем они будут помещены в файл данных CGI.

Секция [Form Literal]

Если запрос от клиента пришел в виде HTTP POST из HTML формы (с типом содержимого application/x-www-form-urlencoded или multipart/form-data), то сервер раскодирует данные из формы и поместит их в секцию [Form Literal].

Для URL-кодированных данных формы, строка передаваемых параметров выглядит как "параметр=значение&параметр=значение&...", где значения находятся в url-кодированном формате. Сервер разделяет "параметр=значение" по символу '&', затем разделяет собственно "параметр" и "значение", декодирует "значение" и помещает результат в виде "параметр=раскодированное_значение" в секцию [Form Literal].

Для многостраничных данных строка данных представляется в многостраничном MIME формате, где каждое поле представлено как отдельная часть (файл). Сервер декодирует имена и значение каждой части и размещает их в формате "параметр=значение" в секции [Form Literal].

Если форма содержит какие-либо элементы SELECT MULTIPLE, то будет создано несколько строк с вида "параметр=значение" с одинаковым именем "параметра". В этом случае генерирует нормальную строку "параметр=значение" для первого встречающегося элемента, а каждый следующий представляет в виде "параметр_X=значение", где "X" - увеличивающийся счетчик.

Секция [Form External]

Если размер декодированной строки превышает 254 символа или декодированная строка содержит управляющие символы, такие, как перевод строки, возврат каретки, двойные кавычки и т.д., то сервер помещает данное значение в отдельный временный файл, а в секцию [Form External] помещает строку в виде:

 параметр=путь длина

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

Секция [Form Huge]

Если общая длина строки с кодированными параметрами превышает 65,535 байт, то сервер не выполняет декодирование, а оставляет данный в Content File, а в секцию [Form Huge] помещает строки в виде:

 параметр=смещение длина

где смещение - это смещение от начала Content File по которому находится требуемый параметр, а длина - длина в байтах значения выбранного параметра. Вы можете использовать смещение для выполнения поиска начала значения выбранного вами параметра и использовать длину для чтения значения выбранного параметра. Не забывайте, что если параметр закодирован, то вам необходимо раскодировать его перед использованием.

Секция [Form File]

Если запрос пришел в виде multipart/form-data, то он может содержать один или несколько загруженных с клиента файлов. В этом случае каждый загруженный файл размещается в специальном временном файле, а в секции [Form File] строки имеют тот же формат, что и секции [Form External]. каждая строка параметра в этом случае выглядит так:

 параметр=[полный_путь_к_файлу] длина тип ссылка [имя_файла]

где полный_путь_к_файлу - это путь к временному файлу, содержащему загруженный файл, длина - длина в байтах загруженного файла, тип - тип  MIME загруженного файла, ссылка - способ кодировки загруженного файла и имя_файла - исходное название загруженного файла. Использование квадратных скобок обязательно, поскольку имя файла и путь могут содержать символы пробела.

2. Вызов CGI программ

Сервер использует функцию CreateProcess() для вызова CGI программ. Сервер синхронизируется с CGI программой, поскольку он должен определить момент завершения CGI программы. Это достигается использованием функции Win32 WaitForSingleObject(), ожидающей получения сигнала завершения CGI программы.

Сервер должен вызывать CGI программу выполняя функцию CreateProcess() с командной строкой следующего формата:

  WinCGI-exe cgi-data-file

WinCGI-exe

Полный путь к исполняемой CGI программе. Сервер не зависит от "текущего каталога" или переменной окружения PATH. Примите к сведению, что "исполняемая" не обязательно означает .EXE файл. Это может быть документ, ассоциирующийся с реально исполняемой программой, описанной в WIN.INI или System Registry.

cgi-data-file

Полный путь к CGI файлу данных.

Сервер использует CreateProcess() для запуска процесса, не имеющего главного окна. Вызванный процесс не будет отображаться каким либо образом на мониторе сервера.

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

CGI файл данных

Сервер передает данные CGI программам через Windows "private profile" afqk, в формате "параметр-значение" (windows INI файл). CGI программа может прочитать данный файл и получит все данные, передаваемые ей из формы, а также автоматически генерируемые броузером данные.

Обработка результата

CGI программа возвращает результат работы, отвечающий (явно или неявно) целям запроса. Сервер кодирует результат работы в соответствии со стандартом HTTP и использует HTTP для отправки результата клиенту. Это означает, что сервер добавляет необходимый HTTP заголовки в сообщение, формируемое CGI программой.

Результат работы CGI программы состоит из двух частей: заголовка и тела сообщения. Заголовок состоит из одной или более строк текста, отделенных от тела пустой строкой. Тело сообщения содержит данные, представленные в MIME формате, указанном в заголовке.

Сервер не изменяет тело документа, что означает, что сервер передает сформированный CGI программой ответ "как он есть".T

Специальные строки заголовка

Сервер распознает следующие строки заголовка в выходном потоке:

Content-Type:

Указывает на MIME тип тела сообщения. Значение этого параметра должно быть в форматеtype/subtype.

URI: <value> (value enclosed in angle brackets)

Данное значение указывает на полный URL или ссылку на локальный файл, сообщение из которого будет возвращено клиенту в теле сообщения. Если значение является локальным файлом, сервер отсылает его как результат запроса, как будто клиент воспользовался методом GET при генерации запроса. Если значение является полным URL, то сервер возвращает сообщение "401 redirect" для обеспечения прямой загрузки указанного объекта.

Location:

То же самое, что и URI, но данная форма сейчас не используется. Параметр value НЕ должен быть взят в угловые скобки.

Прямой возврат

Сервер позволяет конечному приложению осуществлять прямой возврат результата запроса клиенту. Это осуществляется посредством включение в заголовок возвращаемого сообщения его информационного протокола. Это позволяет CGI программам формировать непосредственный ответ клиенту с указанием HTTP заголовка без предварительной обработки его сервером..

Сервер анализирует результат запроса, помещаемый CGI программой в выходной файл (Output File), и, если первая строка "HTTP/1.0", он предполагает, что сообщение содержит полный HTTP ответ и отсылает его клиенту без упаковки.

Создание интерактивных приложений для Web с такими же, как у большинства клиент-серверных приложений, богатыми и динамичными возможностями представления данных может стать весьма непростой задачей. Чтобы сложное, ориентированное на обработку транзакций приложение работало в среде Web-браузера, оно должно "уметь" выводить Web-страницы, на которых используемый набор данных и содержание меняются в зависимости от вида решаемой задачи, а также создавать HTML-страницы, как говорится, "на лету". Кроме того, необходимо, чтобы серверное приложение имело возможность обращаться к одной или нескольким базам данных.

Сравнительно недавно для работы с Common Gateway Interface (CGI) появилась новая категория усложненных инструментальных средств, названных мощными CGI-инструментами и предназначенных для создания подобных приложений.

Для обозначения Web-среды, в которой на основе разработанных сценариев можно создавать динамические HTML-тексты. Мощный CGI-сценарий всегда выполняется не на клиентской стороне, а на стороне сервера. Такие сценарии просты в написании, запускаются на центральном узле (Web-сервере) и предоставляют пользователям возможность вводить данные через Web-браузер в интерактивном режиме. Язык сценариев также обеспечивает доступ к СУБД, например таким, как Oracle, SQL Server, Paradox, Access и др., посредством обращения к ним на языке их собственных средств или через интерфейс Open Database Connectivity (ODBC).

С помощью команд высокого уровня, образующих сценарий, можно задать вид и определить "поведение" Web-страницы, с которой будет работать пользователь. Реализующая этот сценарий программа использует его для генерации HTML-текста. Не нужно быть экспертом по HTML или CGI, поскольку мощные CGI-инструменты выполняют большую часть работы самостоятельно. Сейчас, когда в интрасетях оперируют все более сложными документами и значительно более развитыми средствами ввода данных, эти инструменты помогут разрабатывать Web-страницы с динамически меняющимся содержанием, которые будут выглядеть и "вести" себя наилучшим образом, к тому же сэкономят время.

Совместное использование для обработки введенных в форму данных операторов языка HTML и программных средств CGI - наиболее популярный метод ввода данных через Web-страницу. Боўльшая часть ПО CGI состоит из сценариев, написанных на языке Perl, однако для повышения производительности в некоторых приложениях используются языки Cи и Си++.

Комбинация стандартных средств CGI и HTML имеет и некоторые отрицательные моменты. Так, самым большим недостатком является всегда неизменный вид Web-страницы. Поэтому вам необходимо создавать пригодную сразу для всех случаев жизни страницу, а пользователь должен сам разобраться, когда применять тот или иной ее элемент.

Общеизвестно, что на самом нижнем уровне шкалы возможностей языка HTML с помощью текстового процессора или HTML-редактора можно создавать статические Web-страницы, в которые нельзя вводить какие-либо данные. В связи с этим для создания динамического HTML-текста вам нужно что-то другое, а не текстовый процессор или HTML-редактор. На вершине же иерархии методов создания Web-страниц находятся мини-приложения Java - гибкие интерактивные средства ввода данных, применение которых еще не стало обычным делом.

С помощью таких инструментов, как IntraBuilder фирмы Borland International, HTMLScript фирмы HTMLScript, Cold Fusion и WebMate/Foundation фирмы Allaire и CGI Toolkit фирмы Pictorius, интерактивные Web-приложения могут использовать способность Web-браузера действовать как простая клиентская программа для ввода и вывода данных. Некоторые продукты, например CICS Gateway фирмы IBM, транслируют HTML в другие языки описания страниц (CICS Gateway транслирует HTML-текст в поток данных для терминала 3270), а следовательно, не подходят под наше определение мощных CGI-инструментов.

4 Использование CGI

4.1Конфигурирование сервера для CGI

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

* Обозначенный каталог. Некоторые серверы позволяют определить, что все файлы в обозначенном каталоге (обычно, по умолчанию, называемый cgi-bin) являются CGI

* Расширения имени файла. Много серверов имеют такую предварительную конфигурацию, которая позволяет определять все файлы заканчивающиеся на .cgi, как CGI. 

Метод обозначенного каталога - это своего рода пережиток прошлого (самые первые серверы использовали его как единственный метод для определения того, какие файлы были программами CGI), но он имеет несколько преимуществ. 
     * Он сохраняет программы CGI в централизованном виде, препятствуя загромождению других каталогов. 
     * Вы не ограничены каким-либо определенным расширением имени файла, так что можете называть файлы так, как хотите. Некоторые серверы позволяют обозначить несколько различных каталогов в качестве каталогов CGI. 
     * Он также дает больше возможностей в отношении контроля над теми, кто может записывать CGI. Например, если Вы имеете сервер и поддерживаете систему с несколькими пользователями и не хотите, чтобы они использовали свои собственные сценарии CGI без предварительной ревизии программы из соображений безопасности, можно обозначить только эти файлы в ограниченном,централизованном каталоге как CGI. Пользователи тогда должны будут предоставить Вам программы CGI для установки и Вы сможете сначала провести ревизию кода, чтобы удостовериться, что у программы нет каких-либо крупных проблем с защитой. 
Обозначение CGI через расширение имени файла может быть полезно благодаря его гибкости. Вы не ограничены одним единственным каталогом для программ CGI. Большинство серверов может быть конфигурировано, чтобы распознать CGI через расширение имени файла, хотя по умолчанию не все из них конфигурированы таким образом.

4.2 Установка CGI на серверах UNIX, Windows, Macintosh

Установка CGI на серверах UNIX

Независимо от того, как конфигурирован ваш сервер UNIX, нужно предпринять несколько шагов, чтобы удостовериться в том, что ваши приложения CGI выполняются должным образом. Ваш сервер Веб обычно будет работать как несуществующий пользователь (то есть пользователь UNIX nobody - учетная запись, которая не имеет прав доступа к файлу и не может быть зарегистрирована). Сценарии CGI (написанные на Perl, оболочке Bourne или на другом языке описания сценария) должны быть, выполнимы и читаемы по всему миру.

Подсказка

Чтобы сделать ваши файлы читаемыми и выполнимым по всему миру, используйте следующую команду UNIX права доступа: chmod 755 имени файла.

Если Вы используете язык описания сценария типа Perl или Tcl, укажите полный путь вашего интерпретатора в первой строке вашего сценария. Например, сценарий Perl, использующий perl в каталоге /usr/local/bin должен начинаться со следующей строки: 
#!/usr/local/bin/perl

Предостережение

Никогда не помещайте интерпретатор (perl, или двоичный код Tcl Wish в каталог /cgi-bin. Это создает опасность для защиты в Вашей системе. Более подробно это описано в Главе 9.

Установка CGI на Windows

Большинство серверов, доступных для Windows 3.1, Windows 95 и Windows NT конфигурировано с помощью метода "расширение имени файла" для распознавания CGI. Вообще, изменение конфигурации сервера на базе Windows просто требует выполнения программы конфигурации сервера и внесения соответствующих изменений.

Иногда конфигурирование сервера для правильного выполнения сценарий (типа Perl) представляется сложным делом. В DOS или Windows, Вы не сможете определить интерпретатор на первой строке сценария, как это происходит при работе с UNIX. Некоторые серверы имеют заранее заданную конфигурацию, чтобы связать некоторые расширения имени файла с интерпретатором. Например, многие Веб-серверы Windows предполагают, что файлы, оканчивающиеся на .pl, являются сценариями Perl. 
Если сервер не выполняет такой тип ассоциации файла, можно определить пакетный файл упаковщика, который вызывает как иинтерпретатор, так и сценарий. Как и с сервером UNIX, не устанавливайте интерпретатор ни в каталоге cgi-bin ни в каком-либо Веб-доступном каталоге.

Установка CGI на Macintosh

Две наиболее известные опции сервера для Macintosh - это WebStar StarNine и его предшественник MacHTTP. Оба распознают CGI по расширению имени файла. 
MacHTTP понимает два различных расширения: .cgi и .acgi, который обозначает асинхронный CGI. Регулярные программы CGI, установленные на Macintosh (с расширением .cgi), будут поддерживать Веб-сервер в состоянии занятости, пока не закончится выполнение CGI, вынуждая сервер приостановить выполнение всех других запросов. Асинхронный CGI, с другой стороны, позволяет серверу принимать запросы даже во время своей работы. 
Разработчик CGI Macintosh, использующий любой из этих Веб-серверов, должен, по возможности, использовать просто расширение .acgi, а не расширение .cgi. Оно должно работать с большинством программ CGI; если оно не работает, переименуйте программу на .cgi.

4.3Спецификация CGI

Рисунок 4. Две части интерактивного интерфейса.

Клиентская часть

Для создания клиентской части необходимо создать HTML-документ, в котором реализован интерфейс с пользователем. В языке HTML это возможно посредством форм.

Конструкции языка HTML, используемые при реализации форм

Серверная часть

Серверная часть состоит из исполняемого модуля, решающего основные задачи обработки данных поступающих от клиентской части, формирования ответа в формате HTML, и т.д. Такой модуль называется cgi-модулем.

Методы HTTP запроса

Для реализации взаимодействия "клиент-сервер" важно, какой метод HTTP запроса использует клиентская часть при обращении к WWW серверу. В общем случае, запрос - это сообщение, посылаемое клиентом серверу. Первая строка HTTP запроса включает в себя метод, который должен быть применен к запрашиваемому ресурсу, идентификатор ресурса(URI-Uniform Resource Identifier), и используемую версию HTTP-протокола. В рассматриваемом нами случае, клиентская часть применяет методы запроса POST иGET. Метод POST используется для запроса серверу, чтобы тот принял информацию, включенную в запрос, как относящуюся к ресурсу, указанному идентификатором ресурса. Метод GET используется для получения любой информации, идентифицированной идентификатором ресурса в HTTP запросе.

Для WWW-сервера стандарта NCSA прикладные программы или CGI-модули, обрабатывающие поток данных от клиента или (и) формирующие обратный поток данных могут быть написаны на таких языках программирования как:

  1.  C/C++;
  2.  Любой UNIX shell;
  3.  Fortran;
  4.  Perl;
  5.  Visual Basic;
  6.  TCL;
  7.  AppleScript;

CGI определяет 4 информационных потока.

  1.  Переменные окружения
  2.  Стандартный входной поток
  3.  Стандартный выходной поток
  4.  Командная строка

Переменные окружения

Переменные окружения условно делятся на два типа:

  1.  общие для всех типов запросов (устанавливаются для всех типов)
  2.  зависящие от метода запроса

К переменным первого типа относятся следующие переменные:

SERVER_SOFTWARE содержит информацию о WWW сервере (название/версия)

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

GATEWAY_INERFACE содержит информацию о версии CGI(CGI/версия)

Следующие переменные являются специфичными для разных типов запросов и значения этим переменным присваиваются перед вызовом cgi-модуля.

CONTENT_LENGTH значение этой переменной соответствует длине стандартного входного потока в символах.

CONTENT_TYPE эта переменная специфицирована для запросов содержащих дополнительную информацию, таких как HTTP POST и PUT, и содержит тип данных этой информации.

SERVER_PROTOCOL эта переменная содержит информацию об имени и версии информационного протокола (протокол/версия).

SERVER_PORT значение переменной содержит номер порта, на который был послан запрос.

REQUEST_METHOD метод запроса, который был использован "POST","GET","HEAD" и т.д.

PATH_INFO значение переменной содержит полученный от клиента виртуальный путь до cgi-модуля

PATH_TRANSLATED значение переменной содержит физический путь до cgi-модуля, преобразованный из значения PATH_INFO.

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

QUERY_STRING значение этой переменной соответствует строке символов следующей за знаком "?" в URL соответствующему данному запросу. Эта информация не декодируется сервером.

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

REMOTE_ADDRESSсодержит IP адрес клиента

AUTH_TYPE если WWW-сервер поддерживает аутентификацию (подтверждение подлинности) пользователей и cgi-модуль является защищенным от постороннего доступа то, значение переменной специфицирует метод аутотентификации.

REMOTE_USER содержит имя пользователя в случае аутотентификации.

REMOTE_IDENT содержит имя пользователя, полученное от сервера (если сервер поддерживает аутентификацию согласно RFC 931)

HTTP_ACCEPT список типов MIME известных клиенту. Каждый тип в списке должен быть отделен запятой согласно спецификации HTTP (тип/подтип,тип/подтип и т.д.)

HTTP_USER_AGENT название программы просмотра которую использует клиент при посылке запроса.

Стандартный вывод

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

Заголовок выходного потока 
В некоторых случаях необходимо избегать обработки сервером вывода cgi-модуля, и посылать клиенту данные без изменений. Для отличия таких cgi-модулей, CGI требует, чтобы их имена начинались на nph-. В этом случае формирование синтаксически правильного ответа клиенту cgi-модуль берет на себя.

Заголовки с синтаксическим разбором 
Вывод cgi-модуля должен начинаться с заголовка содержащего определенные строки и завершаться двумя символами CR(0x10).

Любые строки не являющиеся директивами сервера, посылаются непосредственно клиенту. На данный момент, CGI спецификация определяет три директивы сервера:

Content-type 
MIME или тип возвращаемого документа

Например: Content-type: text/html <CR><CR> сообщает серверу, что следующие за этим сообщением данные - есть документ в формате HTML

Location 
указывает серверу, что возвращается не сам документ, а ссылка на него

Если аргументом является URL, то сервер передаст указание клиенту на перенаправление запроса. Если аргумент представляет собой виртуальный путь, сервер вернет клиенту заданный этим путем документ, как если бы клиент запрашивал этот документ непосредственно.

Например: Location: http://host/file.txt приведет к тому, что WWW сервер выдаст file.txt, как если бы он был затребован клиентом. Если cgi-модуль возвращает ссылки на gopher сервер, например на gopher://gopher.ncsa.uiuc.edu/. Вывод будет следующий:

Location: gopher://gopher.ncsa.uiuc.edu/

*Status 
задает серверу HTTP/1.0 строку-статус, которая будет послана клиенту в формате: nnn xxxxx

где: nnn - 3-х цифровой код статуса

ххххх - строка причины

Например: HTTP/1.0 200 OK

Server: NCSA/1.0a6

Content-type: text/plain

<динамически генерируемый текст сообщения>

В данном случае, клиенту будет сообщено об успешном выполнении запроса.

Стандартный входной поток

В случае метода запроса POST данные передаются как содержимое HTTP запроса. И будут посланы в стандартный входной поток.

Данные передаются cgi-модулю в следующей форме:

name=value&name1=value1&...&nameN=valueN

где name - имя переменной\

alue - значение переменной

N - количество переменных

На файловый дескриптор стандартного потока ввода посылается CONTENT_LENGTH байт. Так же сервер передает cgi-модулю CONTENT_TYPE (тип данных). Сервер не посылает символ конца файла после передачи CONTENT_LENGTH байт данных или после того, как cgi-модуль их прочитает. Переменные окружения CONTENT_LENGTH и CONTENT_TYPE устанавливаются в тот момент, когда сервер выполняет cgi-модуль. Таким образом, если в результате исполнения формы с аргументом тега FORM - METHOD="POST" сформирована строка данных firm=МММ&price=100023, то сервер установит значение CONTENT_LENGTH равным 21 и CONTENT_TYPE в application/x-www-form-urlencoded, а в стандартный поток ввода посылается блок данных.

В случае метода GET, строка данных передается как часть URL.

Т.е. например

http://host/cgi-bin/script?name1=value1&name2=value2

В этом случае переменная окружения QUERY_STRING принимает значение 
name1=value1&name2=value2

Аргументы командной строки

СGI-модуль в командной строке от сервера получает:

  1.  остаток URL после имени cgi-модуля в качестве первого параметра (первый параметр будет пуст, если присутствовало только имя cgi-модуля), и
  2.  список ключевых слов в качестве остатка командной строки для скрипта поиска, или
  3.  чередующиеся имена полей формы с добавленным знаком равенства и соответствующих значений переменных.

Ключевые слова, имена и значения полей формы передаются декодированными (из HTTP URL формата кодирования) и перекодированными в соответствии с правилами кодирования Bourne shell так, что cgi-модуль в командной строке получит информацию без необходимости осуществлять дополнительные преобразования.

Последовательность действий для обработки входных данных cgi-модуля для разных методов запроса GET и POST

Исходя из разницы методов запросов GET и POST, можно определить последовательность действий для обработки входных данных cgi-модуля для разных типов запросов.

Для метода GET

  1.  Получить значение переменной QUERY_STRING
  2.  Декодировать имена и их значения (учитывая, что все пробелы при декодировании сервером были заменены символом "+" и все символы с десятичным кодом больше 128 преобразованы в символ "%" и следующим за ним шестнадцатеричным кодом символа.)
  3.  Сформировать структуру соответствия "имя - значение" для дальнейшего использования в cgi-модуле

Для метода POST

  1.  Получить из стандартного входного потока CONTENT_LENGTH символов
  2.  Декодировать имена и их значения (учитывая, что все пробелы при декодировании сервером были заменены символом "+" и все символы с десятичным кодом больше 128 преобразованы в символ "%" и следующим за ним шестнадцатеричным кодом символа.)
  3.  Сформировать структуру соответствия "имя - значение" для дальнейшего использования в cgi-модуле

Очевидно, что отличие только в источнике данных. Поэтому, в принципе, возможно создание единого модуля для методов POST и GET. Необходимо только добавить в начало проверку значения переменной REQUEST_METHOD для определения метода запроса. После формирования структуры "имя-значение" можно приступить к решению задач, ради которых, собственно, создавался cgi-модуль. Понятно, что задачи, решаемые cgi-модулем, могут быть очень разнообразными (получение и обработка почты, доступ к базам данных, гостевая книга и т.д.).

Следующим важным моментом является динамическое формирование cgi-модулем HTML-документа (оформление результата работы модуля). Например, таблицы выборки из базы данных.

Для этого cgi-модуль должен выдать в стандартный выходной поток заголовок состоящий из строки 

Content-type: text/html и пустой строки (двух символов CR)

После этого заголовка можно давать любой текст в формате HTML.


 

А также другие работы, которые могут Вас заинтересовать

9449. Ишемическая болезнь сердца 19.31 KB
  Ишемическая болезнь сердца Это обусловленное расстройством коронарного кровообращения поражение миокарда, возникающее в результате нарушения равновесия между коронарным кровотоком и метаболическими потребностями сердечной мышцы, в следствие атероскл...
9450. Недостаточность кровообращения 28.65 KB
  Недостаточность кровообращения Это патологическое состояние при котором ССС не способна доставлять необходимое количество крови к органам и системам. Различают: Сердечная недостаточность - это патологическое состояние обусловленное недост...
9451. Заболевания печени. Гепатиты и циррозы. Хронический гепатит 28.47 KB
  Заболевания печени. Гепатиты и циррозы. Хронический гепатит. Хронический гепатит - группа заболеваний печени, вызываемых различными причинами, характеризующихся различной степенью выраженности печеночно-клеточного некроза и воспаления про...
9452. ПОНЯТИЕ, ПРЕДМЕТ, СФЕРА ДЕЙСТВИЯ И МЕТОД ТРУДОВОГО 60 KB
  ТЕМА№1: ПОНЯТИЕ, ПРЕДМЕТ, СФЕРА ДЕЙСТВИЯ И МЕТОД ТРУДОВОГО ПРАВА. ПОНЯТИЕ ТРУДОВОГО ПРАВА РОССИИ, ЦЕЛИ И ЗАДАЧИ ТП. предмет ТП СФЕРА ДЕЙСТВИЯ ТП Метод трудового права: понятие и основные особенности правового регулирования тр...
9453. Принципы трудового права 45 KB
  ТЕМА №2: Принципы трудового права. Понятие и значение принципов ТП Классификация принципов ТП Общая характеристика основных принципов ТП. Свобода труда и равенство трудовых прав работников. Вопрос 1. Принципы трудового права...
9454. Источники трудового права 50.5 KB
  ТЕМА №3: Источники трудового права Понятие и система источников ТП. Особенности источников ТП. Локальное регулирование труда Роль судебной практики в регулировании ТО Вопрос 1. Источники ТП - это способы, формы закреплен...
9455. Субъекты трудового права 63 KB
  ТЕМА: Субъекты трудового права. Понятие и виды субъектов ТП. Граждане РФ (работники) - субъекты ТП. Работодатели (ЮЛ и ФЛ) - субъекты ТП. Порядок привлечения и использования труда иностранных граждан по законодатель...
9456. Социальное партнерство (СП) в сфере труда 54.5 KB
  ТЕМА: Социальное партнерство (СП) в сфере труда. Понятие, стороны уровни СП, представительства сторон СП отношений. Формы и органы СП. Российская трехсторонняя комиссия по регулированию социальных ТО. Коллективный договор. Понятие,...
9457. Правовое регулирование занятости населения в РФ 89 KB
  ТЕМА №6: Правовое регулирование занятости населения в РФ. Основные акты и понятия в сфере занятости. Государственные органы содействия занятости. Стратегическая цель государственной политики занятости населения в РФ - это содействие полно...