CGI (Common Gateway Interface)
1) Общие сведения о CGI
С 1993 года CGI является очень часто используемой технологией создания трехзвенных клиент/серверных приложений в Интернет. CGI-приложение совместно с Web-сервером выполняют роль сервера приложений в трехзвенной архитектура клиент/сервер. CGI – набор правил (спецификация), согласно которым пользовательские программы, запускаемые на Web-сервера, могут возвращать данные клиенту в виду HTML-документа. CGI – это консольное приложение, загружаемое в ответ на запрос клиента на выборку или обновление данных, функционирующее как отдельный однопоточный процесс под управлением Web-сервера и выгружаемое сразу после завершения работы. WinCGI – Windows реализация CGI.
2) Варианты реализации
Программа, запускаемая Web-сервером в соответствии со спецификацией CGI, называется CGI-скриптом. Она может быть написана на любом языке программирование (С, Basic, Pascal и т.п.) или на командной языке (языки shell, perl и т.п.), допускающем создание исполняемых модулей. CGI-скрипт исполняет роль посредника между Web-сервером и другими серверами, например, сервером БД, и поэтому часто называется шлюзом. CGI-программы по умолчанию размещаются в каталоге C:\InetPub\Scripts|Cgi-bin, но можно создавать и свой виртуальный каталог.
3) Способы взаимодействия CGI и WEB-сервера
В спецификации CGI предусмотрено несколько способов взаимодействия CGI-программы и Web-сервера, отличающиеся вариантом обмена данными между сервером и программой.
• Передача параметров в командной строке (например, с помощью дескриптором ISINDEX, помещаемого в раздел <HEAD> HTML-документа, или FORM-URLENCODED).
• Передача значений переменных окружения (их более 17 штук).
• Передача данных через стандартный входной поток (STDIN, STDOUT).
Запрос типа ISINDEX – это запрос вида: http://site.ru/somthig-cgi/cgi-script?слово1+слово2+слово3
Главным здесь является список слов после символа «?». Слова перечисляются через символ «+» и для кириллицы не кодируются в шестнадцатеричные последовательности. Последовательность слов после символа «?» будет размещена в переменной окружения QUERY_STRING.
Запрос типа FORM-URLENCODED – это запрос вида: http://site.ru/something-cgi/cgi-script?field=word1&field2=word2
Данные формы записываются в виде пар «имя_поля-значение», которые разделены символом «&».
Переменные окружения, которые не зависят от типа запроса:
SERVER_SOFTWARE – показывает название и версию http-сервера в формате: название/версия.
SERVER_NAME – показывает доменное имя сервера.
SERVER_ADDR – показывает IP сервера.
SERVER_ADMIN – e-mail администратора web-сервера.
GATEWAY_INTERFACE – версия CGI на момент компиляции httpd демона в формате: CGI/версия
DATE_GMT – текущая дата и время во временной зоне GMT.
DATE_LOCAL – текущие дата и врем во временной зоне сервера.
DOCUMENT_ROOT – путь к главному каталогу web-сервера.
Переменные окружения, которые зависят от типа запроса:
SERVER_PROTOCOL – протокол, по которому был получен запрос.
SERVER_PORT – порт, на который был получен запрос.
REQUEST_METHOD – тип запроса: POST, GET и так далее.
REQUEST_URL – страница, отправившая запрос.
SCRIPT_NAME – URL скрипта без имени сервера.
SCRIPT_FILENAME – полное имя файла скрипта на диске.
QUERY_STRING – информация, содержащаяся в командной строке вызова скрипта (после ? в URL’е).
CONTENT_TYPE – MIME-тип данных, передаваемых скрипту.
CONTENE_LENGTH – длина передаваемых данных.
Поток стандартного вывода:
Ввод данных в скрипт через поток стандартного ввода осуществляется только при использовании метода доступа к ресурсу (к скрипту) POST. При этом в переменную окружения CONTENT_LENGTH помещается число символов, которое необходимо считать из потока стандартного ввода скрипта, а в переменную окружения CONTENT_TYPE помещается тип кодирования данных, которые считывают из потока стандартного ввода. При посимвольном считывании в С можно применить, например, такой фрагмент кода:
int n;
char *buf;
n=atoi(getenv(*CONTENT_LENGTH*));
buf=(char *)malloc(n+1);
memset(buf, ‘\000’,n+1);
for (i=0; iBR> {buf[i]=getchar()}
…
free(buf);
4) Методы передачи данных
a) Метод GET выполняет передачу данных CGI-программе через переменные окружения (среды), которые фактически добавляются к URL через разделительный знак ?.
Прежде всего, для этих целей используется переменная query_string – длинная строка, состоящая из пар имя = значение, отделяемых друг от друга символом амперсанда — &. Получается быстро, однако объем передаваемых данных не превышает 256?1024 байт в зависимости от типа Web-сервера.
b) Метод POST выполняет передачу данных через стандартный поток ввода stdin (Ini-файл для WinCGI). Фактически данные добавляются к телу HTML-запроса. Количество передаваемых байт указывается в переменной среды content_length. Это более медленный способ передачи данных, но объем передаваемых данных не ограничен.
c) Параметр HREF тэга A
Помимо методов GET и POST тэга