
- •Лабораторная работа № 9 Тема: Применение cgi-скриптов
- •1 Сведения из теории
- •Переменные окружения
- •Механизмы приема данных
- •Interface
- •Implementation
- •InParams,aPasswd : string;
- •Var I, l: integer;
- •Var ss, st : string; k : integer;
- •Var parmstring:String;I:Integer;
- •Пример использования метода get
- •Пример использования метода post
- •I:integer;
- •If Not Eof(Input) then begin
- •2.5 Вывод изображений
- •Var s:TfileStream;
- •I: Integer;
- •VarValue: array [0..200] of Char;
- •If (GetEnvironmentVariable (pChar(ReqVar),
- •2.3 Разработайте cgi-программу гостевой книги.
- •Var I, l: integer;
- •Var buffer:array[0..1024] of char;
- •Var ss, st : string;
- •Var k:Integer;
- •Var n:Integer;
- •Var parmstring:String;I:Integer;
- •3 Содержание отчета
- •Контрольные вопросы
- •Литература
Механизмы приема данных
Обмен данными в WWW подразделяется в соответствии с типами методов доступа протокола HTTP и видами запросов в спецификации CGI.
Для полноценной работы CGI-приложения оно должно уметь не только выводить некие данные, но и получать данные от пользователя, то есть обеспечивать ввод информации. Ввод данных в случае CGI-приложения будет осуществляться по средствам интерфейса организованного Web-формой. Такая форма может передавать данные двумя описанными выше способами, в зависимости от значения атрибута “METHOD”.
Метод POST используется в тех случаях, когда необходимо передать большое количество параметров или большой объем данных. При использовании же метода GET для хранения всех передаваемых параметров используется переменная среды окружения и ее максимального размера в некоторых случаях может не хватить.
В запросах по методу GET данные от клиента передаются CGI-программе в переменной окружения QUERY_STRING. В запросах по методу POST данные от формы пользователя передаются в потоке стандартного ввода CGI-программе. При передаче через поток стандартного ввода в переменной окружения CONTENT_LENGHT указывается число передаваемых символов.
Запрос типа form-urlencoded — это запрос вида:
http://intuit.ru/somthig-cgi/cgi-script?field=word1&field2=word2
Данные формы записываются в виде пар "имя_поля-значение", которые разделены символом "&" (т.е в формате URLencoded). Все символы после символа "?" попадут в переменную окружения QUERY_STRING. При этом если в значениях полей появляется кириллица или специальные символы, то они заменяются шестнадцатеричным кодом символа, который следует за символом "%".
Приведенный синтаксис обращения, используется при обращение к CGI-приложению по методу GET.
<FORM METHOD=”GET” …>
При обращении к CGI-приложению по методу POST:
<FORM METHOD=”POST” …>
Данные после символа "?" не будут размещаться в QUERY_STRING, а будут направлены в поток стандартного ввода CGI-приложения. В этом случае количество символов в потоке стандартного ввода CGI-приложению будет указано в переменной окружения CONTENT_LENGTH.
При запросе типа multipart/form-data применяется составное тело HTTP-сообщения, которое представляет собой данные, введенные в форме, и данные присоединенного внешнего файла. Это тело помещается в поток стандартного ввода CGI-программы. При этом к данным формы применяется кодирование как в form-urlencoded, а данные внешнего файла передаются как есть.
Таким образом, задача получения данных CGI-приложением сводится к чтению определенной переменной окружения.
Чтобы определить, каким именно методом CGI-программе переданы параметры, достаточно в CGI-программе проверить переменную среды REQUEST_METHOD.
Ниже приведена функция, с помощью которой можно получить значение переменной среды окружения:
function getvar(varname:string):string;
var
buffer:array[0..1024] of char;
size:integer;
begin
size:=GetEnvironmentVariable(PChar(varname),buffer,sizeof(buffer));
if size=0 then getvar:='' else getvar:=String(buffer);
end;
Так как удобнее работать не с массивами, а со строками, результат функции преобразовывается в строку.
Таким образом, если обратиться к функции в виде GetVar ('REQUEST_METHOD'), то результатом будет строка с методом, которым были переданы параметры то есть: 'GET' или 'POST'.
Согласно спецификации CGI, параметры могут быть прочитаны:
а) из переменной окружения QUERY_STRING для метода GET;
б) из стандартного ввода (STDIN) с помощью процедуры ReadLn для метода POST.
Задача программиста сводится к извлечению значений нужных атрибутов из полученной от броузера строки и преобразования этих значений из вида URLencoded в обычные текстовые данные. Суть URLencoded формата заключается в том, что некоторые символы, содержащиеся в значении поля, заменяются на % и следующим за ним шестнадцатеричным кодом символа, а пробел заменяется на +.
Запросы оператора FORM обрабатываются таким образом, что каждый параметр, отвечающий за имя поля, оканчивается знаком равенства, а остаток представляет собой значение этого параметра. Если присутствует что-либо после имени CGI-программы (шлюза), то эта информация передается в качестве первого параметра. Иначе первый параметр будет пуст.
Например:
/htbin/foo/x/y/z?name1=value1&name2=value2
вызывается как:
/.../foo /x/y/z name1= value1 name2= value2
а
/htbin/foo?name1=value1&name2=value2
вызывается как:
/.../foo '' name1= value1 name2= value2
Рассмотрим примеры формы и CGI приложения, которое бы производило идентификацию пользователя системы.
<!—HTML форма ввода пароля -->
<HTML> <HEAD>
<TITLE>Авторизация доступа</TITLE>
</HEAD> <BODY>
<FORM method=”POST” action=”http://localhost/cgi-bin/chkpaswd.exe”>
Введите пароль:
<input type=”password” name=”paswd” size=20>
<input type=”submit” value=”Найти”>
<input type=”reset” value=”Очистить”>
</FORM>
</BODY>
</HTML>
Так это будет выглядеть в броузере:
Рисунок 11 – Пример формы авторизации пользователя
Пример текста программы для обработки формы идентификации пользователя:
PROGRAM chkpaswd;
{$APPTYPE CONSOLE}
uses
MainUn in 'MAinUn.pas'
begin
Main;
end.
UNIT MainUn;