Common Gateway Interface - средство расширения возможностей World Wide Web технологии
Главное
назначение Common Gateway Interface -
обеспечение единообразного потока
данных между сервером и прикладной
программой, которая запускается
из-под сервера
CGI-скрипт - программа написанная в
соответствии со спецификацией Common
Gateway Interface. CGI-скрипты могут быть
написаны на любом языке
программирования (C, C++, PASCAL, FORTRAN и т.
п.) или командном языке (shell, cshell,
командный язык MS-DOS, Perl и т. п.).
Скрипт может быть написан даже на
языке редактора EMAC в системах Unix
Шлюз - это CGI-скрипт, который
используется для обмена данными с
другими информационными ресурсами
Internet или приложениями-демонами.
Обычная 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 - доменный адрес машины, с
которой осуществляется запрос
· 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 [email protected]
#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="http://polyn.net.kiae.su/cgi-bin/imagemap/russia">
<img SRC="http://demin.polyn.kiae.su/dss/russia.gif"
ISMAP>
</A>
# метка : адрес файла описания
картинки
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