Практическая работа 2. Технология CGI

Опубликовано пользователем Бессонов Л.В. 30.03.2010г.

Одно из важнейших свойств технологии World Wide Web — кроссплатформенность, то есть способность функционировать на различных аппаратных и программных платформах. С разработкой универсальных протоколов, языков разметки и прочих технологий, поддержка которых обеспечивается клиентскими программами, стало возможным построение единого информационного пространства.

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

Common Gateway Interface (CGI) — это спецификация обмена данными между прикладной программой, выполняемой по запросу пользователя, и HTTP-сервером, который данную программу запускает. До появления CGI новые функции нужно было внедрять непосредственно в сервер. CGI позволила разрабатывать программы независимо от сервера, а механизм передачи им управления и данных был унаследован от программирования в среде командной строки. Последнее резко сократило трудозатраты на разработку приложений, так как не надо было программировать интерфейс пользователя: его функции выполняли формы.

Обмен данными с приложением

Обмен данными в Web-технологии подразделяется в соответствии с типами методов доступа протокола HTTP и видами запросов в спецификации CGI.

Основных методов доступа два: GET и POST. Помимо них часто используются HEAD и PUT.

Виды запросов CGI разделяют на два основных MIME-типа: application/x-www-form-urlencoded и multipart/form-data. Второй тип запроса специально создан для передачи больших внешних файлов.

Основы HyperText Transfer Protocol (HTTP)

Протокол HTTP представляет собой договорённость о правилах общения между веб-сервером и веб-клиентом (браузером пользователя или иной программой). Обмен информацией происходит при помощи отсылки сообщений. Каждое сообщение имеет строго определённую структуру. Протокол предусматривает возможность применения различных "методов" обмена, каждый из которых оптимизирован под конкретные задачи.

Структура сообщений

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

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

Тело сообщения не является обязательным, в отличие от заголовка сообщения. Оно может содержать текст, графику, аудио- или видеоинформацию.

Рассмотрим пример общения клиента и сервера. Запрос:

  1. GET /documents/1.html HTTP/1.1
  2. Host: nto.immpu.sgu.ru
  3. User-Agent: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3
  4. Accept: text/html
  5. Connection: close

Этот запрос построчно означает:

  1. Запрашивается соединение с сервером по методу GET, запрашиваемый документ относительно корня веб-сервера лежит в папке documents и называется 1.html, протокол связи HTTP версии 1.1.
  2. Хост: nto.immpu.sgu.ru
  3. Клиентское приложение: Mozilla Firefox версии 3.5.3
  4. Ожидается приём данных соответствующих MIME-типу text/html
  5. Блок заголовков завершён

Откликом на него будет:

  1. HTTP/1.1 200 OK
  2. Date: Tue, 30 Mar 2010 20:10:14 MSD 2010
  3. Server: Apache 2.2
  4. X-Powered-By: PHP/5.2.4-12
  5. Last-Modified: Tue, 30 Mar 2010 20:02:59 MSD 2010
  6. Content-Language: ru
  7. Content-Type: text/html; charset=utf-8
  8. Content-Length: 5121
  9. Connection: close
  10.  
  11. (здесь начинается содержимое страницы)

Этот отклик построчно означает:

  1. Протокол HTTP версии 1.1 поддерживается, код состояния 200 (это означает что всё нормально, если бы случилась ошибка или требовалось бы сообщить клиенту о каком-то особом состоянии сервера, был бы передан другой код состояния).
  2. Временная метка
  3. Программное обеспечение сервера
  4. Дата-время последней модификации передаваемой информации
  5. Все поля, начинающиеся на «X-» считаются справочными, их поддержка не гарантирована, например, если мы создадим свой антивирус, который будет сканировать все документы перед отправкой, можно добавлять к заголовкам передаваемой информации такой: «X-Antivirus: Sanned by VasyaAntivirus Pro - no viruses»
  6. Язык передаваемого контента — русский
  7. Передаваемая информация соответствует MIME-типу text/html, кодировка utf-8
  8. Размер передаваемой информации составляет 5121 байт
  9. Блок заголовков завершён

То что находится выше пустой строки называется заголовком. Заголовок сообщения содержит служебную информацию, необходимую для обеспечения успешного взаимодействия. Эта информация условно разбивается на поля и соответствует формату «Название поля: значение поля»

Названия полей и их содержимое определено стандартом протокола HTTP (спецификации стандартов HTTP 1.1, HTTP 1.0 и 0.9).

Методы доступа

Самой главной директивой HTTP-запроса является метод доступа. Он указывается первым словом в первой строке запроса. В нашем примере это GET. Различают четыре наиболее часто применяемых метода доступа:

  1. GET
  2. HEAD
  3. POST
  4. PUT

Кроме этих четырех методов существует еще около пяти дополнительных методов доступа, но они используются редко.

Метод GET

Метод GET применяется клиентом при запросе к серверу по умолчанию. В этом случае клиент сообщает адрес ресурса (URL), который он хочет получить, версию протокола HTTP, поддерживаемые им MIME-типы документов, версию и название клиентского программного обеспечения. Все эти параметры указываются в заголовке HTTP-запроса. Тело в запросе не передается.

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

Метод HEAD

Метод HEAD используется для уменьшения обменов при работе по протоколу HTTP. Он аналогичен методу GET за исключением того, что в отклике тело сообщения не передается. Данный метод используется для проверки времени последней модификации ресурса и срока годности кэшированных ресурсов, а также при использовании программ сканирования ресурсов World Wide Web. Одним словом, метод HEAD предназначен для уменьшения объема передаваемой по сети информации в рамках HTTP-обмена.

Метод POST

Метод POST — это альтернатива методу GET. При обмене данными по методу POST в запросе клиента присутствует тело HTTP-сообщения. Это тело может формироваться из данных, которые вводятся в HTML-форме, или из присоединенного внешнего файла. В отклике, как правило, присутствует и заголовок, и тело HTTP-сообщения.

Метод PUT

Метод PUT используется для публикации HTML-страниц в каталоге HTTP-сервера. При передаче данных от клиента к серверу в сообщении присутствует и заголовок сообщения, в котором указан URL данного ресурса, и тело — содержание размещаемого ресурса.

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

Особенности Common Gateway Interface

Ранее при размещении документа в каталоге веб-сервера мы не задумывались о том как работает протокол HTTP. Всю необходимую техническую информацию о документе за нас генерировал и передавал клиенту веб-сервер.

Теперь, когда веб-сервер выступает лишь как посредник для передачи информации от программы (например, написанной нами на языке C++ или Pascal) веб-клиенту, необходимо чтобы эту служебную информацию генерировала сама программа.

Реализация CGI в Apache

Конфигурирование Apache для разрешения CGI

Чтобы сторонние программы работали через интерфейс CGI, необходимо разрешить веб-серверу запускать их. Для этого нужно выполнить следующие действия: включить обработчик «cgi-script» при помощи директивы AddHandler или SetHandler, активировать опцию ExecCGI. Например, так:

  1. <Directory C:/www/site.ru>
  2. Options +ExecCGI
  3. AddHandler cgi-script .cgi
  4. </Directory>

CGI — универсальный интерфейс, позволяющий «шлюзовать» любую программу. Но веб-сервер должен знать как эту программу запускать. К примеру, скрипт может быть написан на языках Python, Perl, Pascal, PHP, может быть набором команд интерпретаторов Bash, Sh, либо может быть бинарным (откомпилированным) запускаемым файлом (для ОС семейства Windows такие файлы имеют расширение com или exe).

Для ОС семейства Windows метод запуска скрипта, который будет использовать Apache при обращении к этому скрипту, конфигурируется директивой ScriptInterpreterSource. Допустимые значения этой директивы: Registry, Registry-Strict, Script. Значение по умолчанию: Script.

Если значение этой директивы равно Script, это означает, что способ запуска должен быть определён по самому скрипту. Для этого CGI-скрипты начинают со специальной строчки-комментария, содержащей указание пути и имени программы, которая может этот скрипт интерпретировать. Например так:

  1. #!C:/Perl/bin/perl.exe
  2. # Далее следует программа на языке Perl

Если указано значение ScriptInterpreterSource Registry, то Apache будет просматривать раздел реестра Windows HKEY_CLASSES_ROOT для определения программы, требуемой для интерпретации CGI-скрипта. Если в разделе HKEY_CLASSES_ROOT найдена ветвь, соответствующая расширению CGI-скрипта, то команда, которую Apache применит для запуска, будет взята из ключа Shell\ExecCGI\Command, а если такого ключа не существует, то из Shell\Open\Command.

Если CGI-скрипт представляет собой бинарный запускаемый файл (для ОС Windows это будет файл с расширением exe или com), то в ОС Windows достаточно ScriptInterpreterSource Script, а в ОС Linux достаточно чтобы режим доступа к файлу для процесса Apache включал в себя возведённый бит eXecutive (например, режим 777 наверняка будет удовлетворять этому требованию).

Задание

Используя компилятор gcc соберите mimeTeX.

Для сборки используйте вызов компилятора:

  1. gcc -DAA -DWINDOWS mimetex.c gifsave.c -lm -o mimetex.exe

Вызовите mimetex с параметром "\sum_{k=0}^{\infty}a_{k}e_{kx}"

Баннер SGU.RU