Учебный курс Введение в 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