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 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="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