За исключением тех строк из заголовка HTTP-запроса, которые уже названы, сервер приделывает строкам префикс HTTP_ и заменяет знаки '-' на '_':
HTTP_ACCEPT - Давая запрос на сервер браузер обычно расчитывает получить информацию определеного формата,и для этого он в заголовке запроса указывает поле Accept:,Отсюда скрипту поступает cписок тех MIME,которые браузер готов принять в качестве ответа от сервера.
Пример:HTTP_ACCEPT=text/html,text/plain,image/gif
HTTP_USER_AGENT - Браузер обычно посылает на сервер и информацию о себе,чтоб базируясь на знании особеностей и недостатков конкретных браузеров CGI-скрипт мог выдать информацию с учетом этого. Например,разные браузеры могут поддерживать или не поддерживать какие-то HTML тэги.
Пример:HTTP_USER_AGENT=Mozila/2.01 Gold(Win95;I)
И другие всего их около 30.
CGI-скрипт получает доступ к значениям этих переменых через функции операционной системы (в разных операционных системах это реализуется по разному), тем самым CGI-скрипт получает исчерпывающую информацию об HTTP-запросе. А тело запроса (если оно конечно есть) поступает на STDIN (стандартный поток ввода) скрипта. Размером CONTENT_LENGTH байт.
Тепреь обсудим каким образом CGI-скрипт должен посылать информацию Web-серверу с точки зрения CGI.
Если CGI-скрипт хочет послать что-то в ответ, то он должен сделать это следующим образом. Все выводимые данные должны помещаться в STDOUT скрипта. При этом должен обязательно присутствовать CGI-заголовок (CGI-Header). В CGI-заголовоке могут быть следующие поля:
Content-Type: – должно обязательно присутствовать, если есть тело ответа. Определяет MIME-тип ответа.
Например: Content-Type:text/html
Location: - Должно содержать URL – ресурса на который перенаправляется запрос, как правило в этом случае больше ничего не указывается (т.к запрос перенаправляется на другой сервер)
Например: Location:http://www.idsoftware.com/index.html
Status: - Содержит код завершения работы CGI-скрипта. Если не указан то подразумевается 200 Ok
Например: Status:404 Not found
Далее после CGI заголовка на STDOUT посылается пустая строка, которая отделяет заголовок от тела ответа. И после ее посылается собственно тело ответа тип которого был указан в Content-Type (рисунок, текст HTML или другое).
Web-сервер получив через STDOUT информацию поступившую от CGI-скрипта формирует на базе ее HTTP-ответ который и посылается клиенту (броузеру).
Следует сказать что CGI-скрипт может сам без участия Web-сервера сформировать полностью HTTP-ответ. Такие CGI-скрипты называются - Non-Parsed-Headers , и как отличие их имена должны начинаться с приставки – “nph-” или для Windows – ориентированных Web-серверов первая помещаемая в STDOUT строка должна быть такая “HTTP/1.0” , т.е. версия протокола HTTP, тогда сервер будет считать что данный CGI-скрипт будет nph CGI – скриптом.
Например: nph-animate.cgi
CGI-скрипту можно передавать параметры. Синтаксис этого такой: <URL-скрипта>?Param1&Param2=value&Param+2b%20%5B%5C%5D%5E , где ? – означает что дальнейшие данные рассматриваются как параметры; & - этим символом параметры отделяются друг от друга; % - после этого символа идет 16-й код символа, это необходимо потому-что не все символы можно использовать в командной строке, а с помощью % можно задать абсолютно любой символ; + - определяет пробел (пробелы нельзя использовать в явном виде в командной строке); параметры могуг разбиваться на две части на имя и значение с помощью знак равенства (для удобства). Параметры в зависимости от метода HTTP-запроса передаются CGI-скрипту (при GET присоединяются к командной строке, а при POST поступают как тело запроса на STDIN скрипта). Использование параметров более подробно будет описано, когда речь пойдет об HTML – формах.
Пример CGI-скрипта (я написал пример на языке Pascal т.к. думаю, что c языком Pascal знакомы почти все ) .
Program TestCGI;
{WriteLn –стандартная функция для записи в STDOUT в
языке Pascal}
Begin
WriteLn(‘Content-Type:text/html’);{CGI– заголовок
указан тип MIME передавемых данных }
WriteLn;{ Пустая строка отделяющая
заголовок от тела ответа }
WriteLn(‘<HTML>’);{Тело ответа}
WriteLn(‘<H1>Hello World</H1>’);
WriteLn(‘</HTML>’);
End.
Откомпилируйте данную программу (с помощью компилятора для той операционной системе в которой она будет работать). Поместите ее в директорию /cgi-bin вашего сервера. И попробуйте запустить (из броузера указав ее URL ). Она выведет вам приветствие Hello World.
А сейчас рассмотрим некоторые применения CGI-скриптов.
Прежде всего CGI используется при обработке HTML – форм. Также для создания счетчиков посещений, гостевых книг и чатовых систем.
Одним из самых популярных CGI-приложений являются счетчики. Устройство работы его простое CGI-приложение запускается вместе со страничкой. А при запуске считывает старое число посещений из файла на сервере (например counter.dat) инкременирует и записывает его обратно в этот файл вместо старого числа и при желании отображает его на странице. Но при таком методе не будут отфильтровываться лишние нажатия на ReLoad чтобы их убрать можно в этом файле указывать еще IP-адрес с которого запускается данный скрипт и текущее время. А после считывать IP-адрес и если он такой же а время изменилось не болле чем на 30 секунд с последнего посещения то не записывать ничего нового в этот файл (так например поступает счетчик в Ramblere).
На самом деле создавать анимацию на Web-страницах можно десятками способов. Мы рассмотрим как это можно сделать с помощью CGI. Напишем программу которая выводит последовательно несколько рисунков (по такому же принципу что и анимированный Gif ) для максимальной быстроты будем использовать nph-CGI – скрипт, и воспользуемся многостраничным MIME c заменой предидущей страницы. Рисунки должны храниться с такими же именами как в массиве File данной прогамме.
Program Anim_CGI;
Const
N:=10;{Число изображений}
File1:Array[0..N-1]Of String
=(‘file0.gif’,’file1.gif’,’file2.gif’,’file3.gif’,’file4.gif’,
‘file5.gif’,’file6.gif’,’file7.gif’,’file8.gif’,’file9.gif’);{Массив
из имен файлов изображений}
Procedure SendFile(FileName: String);{Процедура
отправки изображения именем FileName}
Var
F:file;
Buf:char;
Begin
Assign(F,FileName);
Reset(F);
While Not Eof(F) Do Begin
Read(F,Buf);
Write(Buf);
End;
Close(F);
End;
Var
I:Integer;
Cont:boolean;
Begin
WriteLn(‘HTTP/1.0 200 OK’);{nph – скрипт
(полный HTTP-ответ) }
WriteLn(‘Content-Type:multipart/x-mixed-replace;boundary=myboundary’);{многостраничное
MIME}
WriteLn;
WriteLn(‘--myboundary’);{Разделитель}
Cont:=true;
I:=0;{Счетчик}
While Cont Do Begin
{Зацикливание}
If I = MaxInt – MaxInt mod
N Then I:=0;
WriteLn(‘Content-Type:image/gif’);
WriteLn;
SendFile(File1[I mod N]);
WriteLn;
WriteLn(‘--myboundary’);
I:=I+1;
End;
End.
Откомпилируйте данную программу (с помощью компилятора для той операционной системе в которой она будет работать). Поместите ее в директорию /cgi-bin вашего сервера. Затем в ваш HTML – документ добавьте следующий тег - <IMG SRC=”cgi-bin/Anim_CGI.exe”>
Рассмотрим еще одно применение CGI - это изображения ismap.Допустим в вашем HTML – документе есть следующая строка:
<A HREF=”cgi-bin/ismap_test.exe”> <IMG SRC=”somepic.gif” BORDER=0 ISMAP></A>
При нажатии на эту ссылку запуститься CGI-скрипт (указанный в атрибуте HREF тега <A>), но кроме этого в параметры CGI-скрипта передаются координаты указателя мыши в момент нажатия относительно изображения о чем и свидетельствует атрибут ISMAP тега <IMG>. Координаты передаются так – http://somehost/cgi-bin/ismap_test.exe?5,12
Ну а как это использовать зависит лишь от вашей фантазии.