Учебное пособие по CGI-программированию - CGI-заголовок
ОГЛАВЛЕНИЕ
CGI-заголовок
В том случае когда запрашиваемый URI есть CGI-скрипт сервер базируясь на данных запроса создает среду переменных CGI и передает управление скрипту скрипт должен выдать CGI-заголовок,после которого и идет тело ответа,сгенерированое скриптом.
Заголовок (CGI-Header) состоит из полей:
Content-Type:
Должно обязательно присутствовать,если есть тело.
Content-Type: text/html
Location:
Содержит URL ресурса на который скрипт перенаправляет запрос.Как правило,если присутствует это поле больше ничего не указывается.
Location: http://www.idsoftware.com/index.html
Status:
Позволяет CGI скрипту вернуть статус обработки,если это поле не задано,то сервер подразумевает "200 Ok"
Status: 404 Not found
На базе этой информации сервер и формирует окончательный заголовок,который и передается клиенту.
Примеры: Обычно такое выдает скрипт:
nph-скрипты.
Content-Type: text/html <HTML><HEAD>
....... Но иногда такое(когда он служит для перенаправления):
Location: http://www.mustdie.ru/
А вот пример возврата статуса:
Content-Type: image/gif Status: 190 Its seems great like a playing doom! WOW! GIF89a........
Иногда возникает необходимость чтобы CGI -скрипт сам отвечал напрямую клиенту, минуя разбор заголовка.Это во-первых уменьшает нагрузку на сервер,и во вторых, что самое главное такой прямой ответ клиенту позволяет скрипту полностью контролировать транзакцию.Для этого существуют nph-скрипты(Not Parse Header) ,имя скрипта должно начинаться с префикса "nph-" ,Например "nph-animate.cgi" .Такие скрипты сами формируют HTTP-ответ клиенту,что полезно при анимации:
#!/usr/bin/perl #nph-animate.cgi $times = 20;
Этот пример вам выдаст анимацию ,составленую из нескольких .gif -файлов.Если же вы получили вместо анимации сообщение об ошибках,то вам следует,может быть перейти к следующей главе, которая поведает вам о правах доступа- того,без чего Unix не был бы Unixом.
#Заготовте несколько небольних gif-файлов для этой программы
@files = qw(img0.gif img1.gif img2.gif img3.gif);
select (STDOUT); $|=1;
#autoflush mode on
#Generate header print "HTTP/1.0 200 Okay\n";
print "Content-Type: multipart/x-mixed-replace;
boundary=myboundary\n\n";
print "--myboundary\n";
for ($num=1;$num<=$times;$num++) {
foreach $file (@files) {
print "Content-Type: image/gif\n\n";
open(PIC,"$file");
print <PIC>;
close(PIC);
print "\n--myboundary\n";
sleep(3);
}
}
print "\n--myboundary--\n";