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