На главную

Библиотека Интернет Индустрии I2R.ru

Rambler's Top100

Малобюджетные сайты...

Продвижение веб-сайта...

Контент и авторское право...

Забобрить эту страницу! Забобрить! Блог Библиотека Сайтостроительства на toodoo
  Поиск:   
Рассылки для занятых...»
I2R » Фундамент (dns, ftp, http ..) » CGI (классика, FastCGI, ... )

Спецификация Common Gateway Interface

Спецификация Common Gateway Interface

Данная спецификация определяет стандартный способ обмена данными между прикладной программой и http-сервером. Спецификация была предложена для сервера NCSA и является основным средством расширеня возможностей обработки запросов клиентов http-сервером.

Основное назначение CGI - обработка данных из HTML-форм. В настоящее область применения CGI гораздо шире.

Понятие CGI-скрипта CGI-скриптом называют программу, написанную на любом языке программирования или командном языке, которая осуществляет обмен данными с http-сервером в соответствии со спецификацией Common Gateway Interface. Наиболее популярными языками для разработки скриптов являются Perl и С.

Типы запросов

Различают два типа запросов к CGI-скриптам: по методу GET и по методу POST. В свою очередь запросы по мотоду GET подразделяются на запросы типам кодирования: ISINDEX и FORM-URLENCODED, а запросы по методу POST - MULTIPART/FORM-DATA и FORM-URLENCODED.

В запросах по методу GET данные от клиента передаются скрипту в переменной окружения QUERY_STRING. В запросах по методу POST данные от скрипта передаются в потоке стандарного ввода скрипта. При передаче через поток стандарного ввода в переменной окружения CONTENT_LENGHT указывается число передаваемых символов.

Запрос типа ISINDEX - это запрос вида:

http://kuku.ru/somthig-cgi/cgi-script?слово1+слово2+слово3

Главным здесь является список слов после символа "?". Слова перечисляются через символ "+" и для кириллицы не кодируются в шестнадцатиричные последовательности. Последовательность слов после символа "?" будет размещена в переменной окружения QUERY_STRING.

Запрос типа FORM-URLENCODED - это запрос вида:

http://kuku.ru/somthig-cgi/cgi-script?filed=word1&field2=word2

Данные формы записываются в виде пар "имя_поля-значение", которые разделены символом "&".

Приведенный пример - это обращение к скрипту по методу GET. Все символы после "?" попадут в переменную окружения QUERY_STRING. При этом если в значениях полей появляется кирилица или специальные символы, то они заменяются шестнадцатиричным кодом символа, который следует за символом "%".

При обращении к скрипту по методу POST данные после символа "?" не будут размещаться в QUERY_STRING, а будут напрвалены в поток стандартного ввода скрипта. В этом случае количество сомволов в потоке стандартного ввода скрипта будет указано в переменной окружения CONTENT_LENGTH.

При запросе типа MULTIPART/FORM-DATA применяется составное тело HTTP-сообщения, которое представляет из себя данные введенные в форме и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода скрипта. При этом кданным формы применяется кодирование как в FORM-URLENCODED, а данные внешнего файла передаются так как они есть.

Механизмы приема данных скриптом

Скрипт может принять данные от сервера тремя способами:

  • через переменные окружения
  • через аргументы командной строки
  • через поток стандартного ввода

При описании этих механизмов мы будем предполагать, что речь идет об обмене данными с сервером Apache для платформы Unix.

Переменные окружения При вызове скрипта сервер выполняет системные вызовы fork и exec. При этом он создает среду выполнения скрипта, определяя переменные этой среды. В спецификации CGI определено 22 переменные окружения. При обращении к скрипту разными методами и из различных контекстов реальные значения принемают разные совокупности этих переменных. Например, при обращении по методу POST переменная QUERY_STRING не имеет значения, а по методу GET такое значение имеет. Другой пример - переменная окружения HTTP_REFERER. При переходе по гипертекстовой ссылке она определена, а если перейти по значению поля location или через JavaScript-программу, то HTTP_REFERER не будет определен.

Получить доступ к переменным окружения можно в зависимости от языка программирования следующим образом:

#Perl
$a = $ENV;
...
// C
a = getenv("CONTENT_LENGTH");

В случае доступа к скрипту по методу GET данные, которые передаются скрипту, размещаются в переменной окружения QUERY_STRING.

Аргументы командной строки

Как это не странно кажется, но у CGI-скрипта может быть такой элемент операционного окружения как командная строка. Это не значит, что скрипт реально можно вызвать из командной строки через сервер. Тем не менее содержание командной строки скрипта доступно через использование тех же самых функций, как и при вызове его из под интерактивной оболочки:

#Perl
foreach $a (@ARGV)
{
print $a,"\n";
}

// C
void main(argc,argv)
int argc;
char *argv[];
{
int i;
for(i=0;i {
printf("%s\n",argv[i]);
}
}

Оба примера показывают распечатку аргументов командной строки для программ на Perl и С Соответственно.

Аргументы командной строки появляются только в запросах типа ISINDEX.

Поток стандарного ввода

Ввод данных в скрипт через поток стандарного ввода осуществляется только при использовании метода доступа к ресурсу(к скрипту) 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;i {
buf[i]=getchar()
}
...
free(buf);

В данном фрагменте применено динамическиое размещение памяти под скрипт, поэтому при выходе из него следует освободить память. Вообще говоря, память будет автоматически освобождена операционной системой после завершения скрипта. Однако, если переносить скрипт на спецификацию FCGI(Fast CGI), что требует минимума переделок, то из-за неаккуратной работы с памятью могут возникнуть проблемы.

Механизм генерации отклика скриптом Существует толко один способ вернуть данные серверу и соответственно браузеру пользователя - писать в поток стандартного вывода(STDOUT). При этом скрипт должен формировать HTTP-сообщение.

Сначала выводятся директивы HTTP-заголовка. В минимальном варианте - это либо:

Content-type: text/html

либо

Location: http://kuku.ru/

В первом случае определяется тип тела HTTP-сообщения, а во втором осуществляется перенаправление запроса.

После заголовка генерируется сам отклик в виде тела HTTP-сообщения, которое должно быть отделено от заголовка пустой строкой:

#!/bin/sh
echo Content-type: text/plain
echo
echo Hello

В данном случае используется командный интерпретатор sh.

Если скрипт начинает формирование заголовка с директивы типа HTTP-протокола, то сервер не анализирует отклик и передает его так как есть. Если в заголовке, сгенерированным скриптом, эта директива отсутствует, то сервер считает, что заголовок неполный и вставляет в него дополнительные директивы.

Павел Храмцов

Другие разделы
Почта (e-mail)
CGI
Архивы (ftp...)
HTTP
Новое в разделе
DNS
I2R-Журналы
I2R Business
I2R Web Creation
I2R Computer
рассылки библиотеки +
И2Р Программы
Всё о Windows
Программирование
Софт
Мир Linux
Галерея Попова
Каталог I2R
Партнеры
Amicus Studio
NunDesign
Горящие путевки, идеи путешествийMegaTIS.Ru

2000-2008 г.   
Все авторские права соблюдены.
Rambler's Top100