- •Лабораторная работа № 9 Тема: Применение cgi-скриптов
- •1 Сведения из теории
- •Переменные окружения
- •Механизмы приема данных
- •Var parmstring:String;I:Integer;
- •Interface
- •Implementation
- •InParams,aPasswd : string;
- •Var I, l: integer;
- •Var ss, st : string; k : 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 Содержание отчета
- •Контрольные вопросы
- •Литература
If Not Eof(Input) then begin
Read(Input,s);
WriteLn('<li>',s);
WriteLn(fLog,s);
end;
Writeln(fLog,'QUERY_STRING=',ParmString);
WriteLn('<a name=Env><h2>Переменные окружения:</h2><ul>');
p:=GetEnvironmentStrings;
while StrLen(p)<>0 do begin
WriteLn('<li>',p);
WriteLn(fLog,':',p);
p:=strend(p);
inc(p);
end;
WriteLn('</ul><hr>');
WriteLn(
'<a name=Info><a href="http://www.multimania.com/tothpaul">');
WriteLn('Дополнительная информация о CGI</a>');
WriteLn('</body></html>');
end.
Так это выглядит в броузере:
Рисунок 15 - Результат работы CGI-программы
2.5 Вывод изображений
Для сообщения броузеру, что передаваемый документ является HTML-документом, CGI-программа выводит специальный заголовок, не отображаемый броузером:
WriteLn(‘Content-Type: text/html’);
WriteLn('');
Точно таким же образом можно указать и другой тип данных. Например, для вывода изображения в формате GIF достаточно вывести следующее:
WriteLn(‘Content-Type: image/gif’);
WriteLn('');
Таким образом, сообщается броузеру, что далее будет следовать именно изображение, то есть будет происходить передача двоичных данных.
В начале необходимо разобраться, как отправить двоичные данные в стандартный поток вывода: STDOUTPUT. Для этого ниже приведены две процедуры: первая выводит поток TMEMORYSTREAM в STDOUTPUT. Поток памяти TMEMORYSTREAM можно представить себе как расположенный в памяти файл. А вторая выводит двоичный файл в выходной поток:
// Процедура вывода потока в STDOUTPUT.
Procedure WriteStream(stream:TmemoryStream);
var
OutStream:ThandleStream;
begin
Flush(output);
OutStream:=
ThandleStream.Create(GetStdHandle(STD_OUTPUT_HANDLE));
Stream.SaveToStream(OutStream);
OutStream.Free;
end;
// Процедура для передачи двоичного файла
procedure WriteFile(FileName:string);
Var s:TfileStream;
m:TmemoryStream;
begin
s:=TfileStream.Create(FileName,fmOpenRead);
m:=TmemoryStream.Create;
m.LoadFromStream(s);
WriteStream(m); m.Free;s.Free;
end;
Теперь осталось только создать (или взять готовый) GIF файл и вывести его:
procedure WriteGIF(FileName:string);
begin
WriteLn(‘Content-type: image/gif’);
WriteLn;
WriteFile(FileName);
end;
Выполните
2.1 Создайте консольное приложение и протестируйте CGI-программу локально, выводя результат работу на экран.
Пример простейшей CGI-программы:
Program ExampleCGI;
{$apptype console}
begin
WriteLn('Content-type: text/html');
WriteLn;
WriteLn('Hello World');
end.
Откомпилируйте и поместите в каталог c:\internet\delphi\cgi-bin, который должен быть определен как каталог, в котором размещены все CGI-программы.
Для обращения к программе в строке адреса в броузере наберите:
http://ваш_сервер/cgi-bin/ExampleCGI
Проверьте отображение результата:
2.2 Разработайте CGI-программу, которая выводит список некоторых переменных окружения и их значения:
program CgiVars;
{$APPTYPE CONSOLE}
uses
Windows;
const
VarList: array [1..17] of string [30] =
('SERVER_NAME', 'SERVER_PROTOCOL',
'SERVER_PORT', 'SERVER_SOFTWARE',
'GATEWAY_INTERFACE', 'REQUEST_METHOD',
'PATH_TRANSLATED', 'HTTP_REFERER',
'SCRIPT_NAME', 'PATH_INFO',
'QUERY_STRING', 'HTTP_ACCEPT',
'REMOTE_HOST', 'REMOTE_USER',
'REMOTE_ADDR', 'REMOTE_IDENT',
'HTTP_USER_AGENT');
var
