Common Gateway Interface - средство расширения возможностей World Wide Web технологии
Главное назначение Common Gateway Interface
- обеспечение единообразного потока данных между сервером и прикладной
программой, которая запускается из-под сервера
CGI-скрипт - программа Программа - (от греч. — пред, греч. — запись) термин, в переводе означающий «предписание», т.е. написанная в соответствии со спецификацией
Common Gateway Interface. CGI-скрипты могут быть написаны на любом
языке программирования (C, C++, PASCAL, FORTRAN Фортран (Fortran)— первый язык программирования высокого уровня, имеющий транслятор. Создан в период с 1954 по 1957 год группой программистов под руководством Джона Бэкуса в корпорации IBM (язык Планкалкюль, претендующий на пальму первенства, был изобретён ещё в 1945 году, но не был реализован вплоть до 2000 года). Название Fortran является акронимом от FORmula TRANslator (переводчик формул). Фортран широко используется в первую очередь для научных и инженерных вычислений. Одно из преимуществ современного Фортрана— большое количество написанных на нём программ и библиотек подпрограмм. Среди учёных, например, ходит такая присказка, что любая математическая задача уже имеет решение на Фортране, и, действительно, можно найти среди тысяч фортрановских пакетов и пакет для перемножения матриц, и пакет для решения сложных интегральных уравнений, и многие, многие другие. Ряд таких пакетов создавался на протяжении десятилетий и популярен в научной среде по сей день например— IMSL(англ.). и т. п.) или командном
языке (shell, cshell, командный язык MS-DOS, Perl и т. п.). Скрипт Скриптовый язык (англ.scripting language, в русской литературе принято название язык сценариев)— язык программирования, разработанный для записи «сценариев», последовательностей операций, которые пользователь может выполнять на компьютере. Простые скриптовые языки раньше часто называли языками пакетной обработки (англ.batch languages или job control languages). Сценарии обычно интерпретируются, а не компилируются (хотя всё чаще применяют компиляцию каждый раз перед запуском).
может быть написан даже на языке редактора EMAC в системах Unix
Шлюз - это CGI-скрипт, который используется для обмена
данными с другими информационными ресурсами Internet Интернет (произносится [интэрнэт]; англ.Internet)— всемирная система объединённых компьютерных сетей, построенная на использовании протокола IP и маршрутизации пакетов данных. Интернет образует глобальное информационное пространство, служит физической основой для Всемирной паутины и множества других систем (протоколов) передачи данных. Часто упоминается как «Всемирная сеть» и «Глобальная сеть». В обиходе иногда говорят «Инет». или приложениями-демонами.
Обычная CGI- программа запускается сервером HTTP для выполнения
некоторой работы, возвращает результаты серверу и завершает свое
выполнение
Механизмы обмена данными
- переменные окружения
- формат командной строки
- формат стандартного ввода
- формат стандартного вывода
Список переменных окружения
К общим переменным окружения относятся:
- SERVER_SOFTWARE - определяет имя и версию сервера
- SERVER_NAME - определяет доменное имя сервера
- GATEWAY_INTERFACE - определяет версию интерфейса
К запрос Запрос— это формулирование своей информационной необходимости пользователем некоторой базы данных, как, например, поисковой системы. Для составления запроса используется язык поисковых запросов.-ориентированным относятся:
- SERVER_PROTOCOL - протокол сервера
- SERVER_PORT - определяет порт TCP, по которому
осуществляется взаимодействие
Взаимодействие— философская категория, отражающая процессы воздействия объектов друг на друга, их взаимную обусловленность и порождение одним объектом другого. Взаимодействие— объективная и универсальная форма движения, развития, которая определяет существование и структурную организацию любой материальной системы. (80 порт)
- REQUEST_METHOD - определяет метод доступа к информационному
ресурсу
- PATH_INFO - передает программе путь (адрес скрипта)
в виде, указанном в HTML-документе
- PATH_TRANSLATED - то же, что и PATH_INFO, но
только после подстановки сервером определенных в его конфигурации
вставок
- SCRIPT_NAME - определяет адрес скрипта так, как
он указан клиентом
- QUERY_STRING - определяет содержание запроса
к скрипту
Идентификация пользователя и его машины:
- REMOTE_HOST - доменный
Домен (фр.domaine)— область. Домен (область)— в Средние века, владения короля либо какого-либо феодала. В переносном смысле домен— это единица структуры. адрес машины, с которой
осуществляется запрос
- REMOTE_ADDR - IP-адрес запрашивающей машины
- AUTH_TYPE - тип идентификации пользователя
- REMOTE_USER - идентификация пользователя
- REMOTE_IDENT - устанавливается сервером; предназначена
для первоначального использования скрипта
- CONTENT_TYPE - определяет MIME-тип данных, передаваемых
скрипту
- CONTENT_LENGTH - определяет размер данных в байтах,
которые передаются скрипту
Стандартный ввод CGI-скрипта
- Методы GET или Post
- CONTENT-LENGHT
- CONTENT-TYPE
- QUERY-STRING
Стандартный вывод CGI-скрипта
- Заголовок
- CONTENT-TYPE
- Location
- Status
- Тело ответа (обычно текст)
Применение CGI-скриптов
- Простейшие SHELL-скрипты
- Вызов внешней программы через SHELL
- Вызов модуля "С"
- Доступ к базам данных
- Imagemap
Примеры SHELL-скриптов
#!/bin/sh
echo Content-type: text/plain
echo
echo This is the result of script execution.
#The end of script
#!/bin/sh
echo Content-type: text/plain
echo
echo $REQUEST_METHOD
echo $QUERY_STRING
echo $CONTENT_TYPE
echo $CONTENT_LENGTH
#The end of script.
#!/bin/sh
echo Content-type: text/plain
echo
finger paul@polyn.kiae.su
#The end of script.
Пример С-программы
#include <stdlib.h>;
#include <sys/types.h>;
main()
{
long i,n,uid;
char input_ch[1024];
char *env;
env = getenv("CONTENT_LENGTH");
/* Here we recieve a length */
sscanf(env,"%d",&n);
/* of input stream and form */
for(i=0;i<;n;i++)
/* command line */
{ input_ch[i]
= getchar(); }
input_ch[i] = '\000';
printf("Content-type:
text/html\n\n"); /* First message of a CGI Programme */
/* This message must be a first one */
/* in output sream. */
printf("<TITLE>
C-cgi script.(example#1)</TITLE>\n");
printf("<H3><I>
Russian Research Center \"Kurchatov Institute\"<I></H3>\n");
c_uid = -1;
sscanf(input_ch,"uid=%ld",&uid);
/* Transform input data */
printf("Input
Nuber:%ld.<BR><HR>",uid);
exit(0);
}
Доступ к базе данных под управлением Ingres
- Простой вызов постоянного запроса
- Форматирование вывода
- Запрос через Query-String
- Фильтрация
Примеры скриптов
#!/bin/sh
echo Content-type: text/plain
echo
ingres polyn < query
#The end of script
#!/bin/sh
echo Content-type: text/plain
echo
helpr polyn
#The end of script
#!/bin/sh
echo Content-type: text/html
echo
echo '< PRE> '
helpr polyn situat
echo '< /PRE> '
#The end of script
#!/bin/sh
echo Content-type: text/html
echo
echo '< PRE> '
echo $QUERY_STRING | tr "+" " " | ingres polyn
echo '< /PRE> '
#The end of script
#!/bin/sh
echo Content-type: text/html
echo
echo '< PRE> '
echo $QUERY_STRING | sed -f symbols | ingres polyn | tr "\007" "*" | head 100
echo '< /PRE> '
#The end of script
Организация стека графических ссылок
Скрипт imagemap
<A href=#>
# метка : адрес файла описания картинки
russia : /usr/local/etc/httpd/cgi-bin/maps/russia.map
brussia : /usr/local/etc/httpd/cgi-bin/maps/brussia.map
....
#описание прямоугольника
rect 10 20 100 200
circle 50 50 60 60
poly 10 10 20 20 20 10
|