CGI

advertisement
Учебный курс
Введение
в JavaScript и CGI
Лекция 5
Основы CGI
кандидат технических наук
Павел Брониславович Храмцов
paul@kiae.su
1
Обмен данными в рамках WWW
Клиент (мультипротокольный)
FTP
FTP - сервер
HTTP - Сервер
HTTP
HTML
URL (URI)
CSS
JavaScript
Java
Plug-ins
CGI
SSI
PHP
ASP
JSP
API
Perl
Java
2
Темы занятия:
• Common Gateway Interface (CGI)
• Server Site Includes (SSI)
• Cookies
3
CGI
Common Gateway Interface — это спецификация
обмена данными между прикладной программой,
выполняемой по запросу пользователя, и HTTP-сервером,
который данную программу запускает.
4
CGI и HTTP
Методы доступа HTTP:
Основные: GET и POST
Дополнительные: HEAD и PUT
Основные MIME-титы запросов CGI:
application/x-www-form-urlencoded
multipart/form-data
5
CGI и HTTP
Метод
Клиент --> Сервер
Клиент <-- Сервер
G
E
T
По
умолчанию
Только HTTP-заголовок
HTTP-заголовок и страница,
как тело HTTP-сообщения
isindex
Только HTTP-заголовок (список ключевых
слов включен в URL. Слова разделены
символом "+". Кодирования кириллицы не
производится)
HTTP-заголовок и страница,
как тело HTTP-сообщения
formurlencoded
Только HTTP-заголовок (данные из формы
включены в URL страницы. Производится
кодирование специальных символов и
кириллицы) HTTP-сообщения
HTTP-заголовок и страница,
как тело HTTP-сообщения
P formO urlencoded
S
T
Только HTTP-заголовок (данные из формы
включены в URL страницы. Производится
кодирование специальных символов и
кириллицы) HTTP-сообщения
HTTP-заголовок и страница,
как тело HTTP-сообщения
HTTP-заголовок и составное тело HTTPсообщения. Первая часть тела — данные из
формы, для которых производится
кодирование, вторая часть тела —
присоединенный файл как он есть
HTTP-заголовок и страница,
как тело HTTP-сообщения
PUT
HTTP-заголовок и документ, как тело HTTPсообщения
HTTP-заголовок. В качестве
тела можно передать
комментарий к коду возврата
HEAD
HTTP-заголовок
HTTP-заголовок
form-data
6
Спецификация Common Gateway Interface
В CGI имеет смысл выделить следующие основные моменты:
•понятие CGI-скрипта;
•типы запросов;
•механизмы приема данных скриптом;
•механизм генерации отклика скриптом.
7
Понятие CGI-скрипта
CGI-скриптом называют программу, написанную на
любом языке программирования или командном
языке, которая осуществляет обмен данными с HTTPсервером в соответствии со спецификацией Common
Gateway Interface.
Наиболее популярными языками для разработки
скриптов являются Perl и С.
8
Понятие CGI-скрипта
Пример скрипта на языке Perl:
#!d:/Perl/bin/perl.exe
##
## printenv -- demo CGI program which just prints its environment
##
print "Content-type: text/plain; charset=iso-8859-1\n\n";
foreach $var (sort(keys(%ENV))) {
$val = $ENV{$var};
$val =~ s|\n|\\n|g;
$val =~ s|"|\\"|g;
print "${var}=\"${val}\"\n";
}
9
Типы CGI запросов
Запрос типа ISINDEX — это запрос вида (метод GET):
http://intuit.ru/somthing-cgi/cgi-script?слово1+слово2+слово3
Запрос типа form-urlencoded — это запрос вида (метод GET):
http://intuit.ru/somthing-cgi/cgi-script?field=word1&field2=word2
Запрос типа multipart/form-data (метод POST) – в нем применяется
составное тело HTTP-сообщения, которое представляет собой
данные, введенные в форме, и данные присоединенного
внешнего файла.
10
Механизмы приема данных скриптом
Скрипт может принять данные от сервера тремя способами:
• через переменные окружения;
• через аргументы командной строки;
• через поток стандартного ввода.
11
Механизмы приема данных скриптом
Переменные окружения
Примеры:
#Perl
$a = $ENV{CONTENT_LENGTH}; ...
// C
a = getenv("CONTENT_LENGTH");
12
Механизмы приема данных скриптом
Аргументы командной строки
#Perl
foreach $a (@ARGV) { print $a,"\n"; }
// C
void main(argc,argv)
int argc;
char *argv[ ];
{
int i;
for(i=0;i<argc;i++)
{ printf("%s\n",argv[i]); }
}
13
Механизмы приема данных скриптом
Поток стандартного ввода
int n;
char *buf;
n= atoi(getenv("CONTENT_LENGTH"));
buf = (char *) malloc(n+1);
memset(buf,'\000',n+1);
for(i=0;i<n;i++) { buf[i]=getchar(); }
free(buf);
14
Механизм генерации отклика скриптом
Существует только один способ вернуть данные серверу и,
соответственно, браузеру пользователя
— это писать в поток стандартного вывода (STDOUT).
При этом скрипт должен формировать HTTP-сообщение.
15
Механизм генерации отклика скриптом
Сначала формируем HTTP директивы заголовка HTTP сообщения:
Content-type: text/html,
либо
Location: http://intuit.ru/
Потом через пустую строку формируем тело сообщения.
Пример:
#!/bin/sh
echo Content-type: text/plain
echo
echo Hello
16
Примеры скриптов на Bash
Структура скрипта:
#!/usr/local/bin/bash
echo Hello BASH
Это еще не CGI-скрипт. Он не поддерживает правила
спецификации CGI.
#!/usr/local/bin/bash
echo Content-type: text/plain
echo
echo Hello BASH
Это уже CGI-скрипт. Поддерживает правила генерации отклика.
17
Примеры скриптов на Bash
Стандартный поток вывода
echo first_arg#$1 second_arg#$2
echo QUERY_STRING:$QUERY_STRING
echo '<H1>QUOTING</H1>'
echo '<H1>'$QUERY_STRING'</H1>'
echo '<H1>'`date`'</H1>'
echo '<H1>'$(date)'</H1>'
18
Примеры скриптов на Bash
Переменные окружения
#!/usr/freeware/bin/bash
echo Content-type: text/html
echo
echo '<HTML><HEAD></HEAD><BODY>'
echo '<H1>переменные окружения</H1>' echo '<TABLE
BORDER=1>'
echo '<TR><TD>Имя</TD><TD>значение</TD></TR>'
IFS='='
set | while read x y
do
echo '<TR><TD>'$x'</TD><TD>'$y'</TD></TR>'
done
echo '</TABLE>' echo '<HR>' echo '</BODY></HTML>'
19
Примеры скриптов на Bash
Переменные окружения (можно обратить к переменной окружения
по имени):
#!/usr/freeware/bin/bash
echo Content-type: text/html
echo
echo '<HTML><HEAD></HEAD><BODY>'
echo '<H1>QUERY_STRING</H1>'
echo QUERY_STRING = $QUERY_STRING
echo '<HR>'
echo '</BODY></HTML>'
20
Примеры скриптов на Bash
Аргументы командной строки
bash>ps -ax | grep httpd | wc -l
• ps задана с аргументом -ax;
• grep задана с аргументом httpd;
• wc задана с аргументом -l.
http://www.intuit.ru/cgi-bin/ argv.cgi?arg1+arg2+arg3
Есть переменная bash #. В данном случае ее значение ($#) равно 3
21
Примеры скриптов на Bash
Стандартный поток ввода
Для чтения данных из стандартного потока ввода в рамках
программирования CGI-скриптов bash непригоден.
Но чтение из стандартного потока ввода можно использовать:
echo $QUERY_STRING | tr '+' ' ' | while read x
do
for y in $x
do
echo $y
done
done
22
Немного о Bash
Типы данных и переменные
$1-$n — аргументы командной строки скрипта;
$0 — имя скрипта;
$@ — список аргументов командной строки;
$# — число аргументов командной строки;
$IFS — список разделителей;
$PATH — путь поиска команд.
Управление потоком вычислений
if list; then list; [elif list; then list;] ...[ else list;] fi
ps -axj | grep httpd | while read id pid do if test $id = "root"; then kill -1
$pid; fi done
for var; in list; do list; done
if test $REQUEST_METHOD = "POST"; …
23
CGI-скрипты и Perl
Perl как язык разработки скриптов имеет ряд преимуществ.
Перечислим их в порядке значимости:
•
•
•
•
•
•
•
•
•
независимость от программно-аппаратной платформы;
мощные средства разбора строк (регулярные выражения);
простота работы с переменными окружения;
простота работы со входными и выходными стандартными
потоками;
возможность чтения заданного числа символов из входного
потока;
хешированные таблицы (ассоциативные массивы);
возможность организации конвейеров;
библиотеки TCP/IP-обмена;
множество стандартных библиотек прикладных программ.
24
Download