PERL - статьи

       

Протокол HTTP





Что такое протокол HTTP и для чего он нужен, я думаю расказывать не нужно, поэтому сразу приступим к более подробному рассмотрению. Какое отношение HTTP протокол имеет к Perl? Да самое прямое. Без знания HTTP протокола, нельзя написать практически никакого CGI скрипта.

Итак, договоримся о терминах.
Веб-сервер - програмное обеспечение, которое следит за 80 (возможны и другие варианты, но данный наиболее популярен) портом и в случае обнаружения запроса, выдает некоторую информацию (сообщение об ошибке, html документ).
Клиент - программное обеспечение осуществляющее подключение к 80 порту сервера и посылающее туда запрос.

Помимо выдачи статичных документов, веб-серверы умеют выдавать результаты работы скрипта. т.е. если клиент запрашивает документ, который на самом деле является CGI скриптом, то веб-сервер запускает этот скрипт на выполнение, а всю информацию полученную со стандартного выхода скрипта, перенаправляет клиенту.

В процессе прочтения данного документа, вам наверно захочется попробовать все предложенные примеры. Используйте для этого любой telnet клиент. Просто соединитесь с 80 портом сервера, на котором расположен ваш любимый сайт.

Взаимодействие, между веб-сервером и клиентом просто до неприличия. Клиент посылает запрос состоящий из заголовка и (иногда) тела, а веб-сервер выдает ответ, который так же состоит из заголовка и тела. Рассмотрим более детально, как же выглядят эти запросы и ответы.



Любой запрос начинается строкой:

МЕТОД РЕСУРС HTTP/версия


МЕТОД - один из поддерживаемых веб-сервером методов. Наиболее распространены:

GET - в этом случае выдается запрошенный ресурс. Самый старый и самый распространенный метод.

HEAD - в этом случае, выдается только заголовок документа. Из заголовка можно узнать существует ли документ, его размер и еще некоторую информацию, о которой ниже. Данный метод, как правило, используется для проверки ссылок и кеширующими системами.

POST - аналогичен методу GET, но не только запрашивает ресурс, но и передает ему некоторую информацию. Если ресурс - CGI скрипт, то информация поступает на его стандартный ввод. Метод GET тоже умеет передавать информацию для CGI скриптов, но передает он ее в самом имени ресурса. Дело в том, что если мы вызовем CGI скрипт таким образом:



script.cgi?ПАРАМЕТРЫ



то веб-сервер запустит на выполнение script.cgi, а тот в свою очередь сможет заполучить ПАРАМЕТРЫ. А вот о том, откуда он их получит, позже.

Кроме вышеперечисленных методов, существуют еще методы PUT - для сохранения данных в указанном ресурсе и DELETE - для удаления указанного ресурса. Как правило они не поддерживаются веб-серверами, сами понимаете почему.

Теперь пример запроса:

GET /~user/cgi-bin/test.pl HTTP/1.0

Это конечно самый простой пример. Обычно, запрос выглядит гораздо сложнее и состоит из нескольких строк. Чтобы веб-сервер знал, что ввод данных закончен, нужно послать ему пустую строку. Т.е в данном примере, нужно нажать Enter два раза (один раз - переход на новую строчку, второй раз - пустая строка).

Если вы запрашиваете главную страницу сайта (т.е. в браузере это www.perl.ru) запрос будет выглядеть так:

GET / HTTP/1.0

Практически все переданные данные можно узнать непосредственно в скрипте на перле. Для этого служит массив %ENV, в котором хранятся так называемые переменные среды CGI. Например:

$ENV{REQUEST_METHOD} = GET

$ENV{QUERY_STRING} = те самые
параметры (script.cgi?параметры)

Узнать все пременные очень просто:

foreach (keys %ENV){
 print "$_ = $ENV{$_}\n";
}

Какую же еще информацию, мы можем передавать веб-серверу?

ПолеПримерОписание
Date:Date: Sun, 30 Dec 2000 23:59:59 GMTДата запроса.
MIME-version:MIME-version: 1.0Версия MIME.
Pragma:Pragma: no-cacheИнформация для шлюзов и прокси-серверов.
Authorization:Authorization: Basic QWxhZGRpbj pvcGVuIHNlc2FtZQ==Информация для авторизации.
From:From: Pupkin@mail.rue-mail пользователя браузера.
If-Modified-Since:If-Modified-Since: Sun, 30 Dec 2000 23:59:59 GMTИспользуется при методе GET. Документ возвращается только в том случае, если он изменился с указанного момента. Как правило браузер, запрашивает документ подобным образом, если копия документа содержится у него в кеше. И соответственно выдает пользователю информацию из кеша или обновленный документ.
Referer:Referer: http://www.perl.ru/URL предшествующего ресурса. Именно по нему на некоторых сайтах определяется, насколько хорошо их рекламирует тот или иной ресурс.
User-Agent:User-Agent: Mozilla/5.0Имя клиента. Может стоять что угодно, но некоторые, особенно гадкие сервера, не выдают страницы "не браузерам".
Host:Host: vasya.narod.ruИмя хоста. Дело в том, что в сети существует очень большое количество виртуальных серверов, т.е. серверов с разными именами, но одним IP адресом. Именно по этой переменной веб-сервер определяет какую же информацию вам дать.
Accept: Accept: text/htmlУказывает серверу, выдавать только данные указанного типа.
Вот основные и наиболее часто используемые данные, передаваемые веб-серверу.

Теперь пара примеров запросов:

GET /cgi-bin/test.cgi?name=Vasily&age=18 HTTP/1.0
User-Agent: Mozilla/5.0

И тоже, но методом POST

POST /~user/cgi-bin/test.cgi HTTP/1.0
User-Agent: Mozilla/5.0
Accept: text/html
Accept: image/gif
Content-Type: application/x-www-form-urlencoded
Content-Length: 18

name=Vasily
&age=18

Теперь рассмотрим, что же отвечает веб-сервер. Ответ веб-сервера выглядит следующим образом:

HTTP/ВЕРСИЯ КОД_ОТВЕТА ФРАЗА_ОТВЕТА

КОД_ОТВЕТА - 3-хзначное число. Указывает что все прошло успешно (200) или код ошибки.

ФРАЗА_ОТВЕТА - Тот же код но по-русски (шучу, по-английски)

Пример:

HTTP/1.1 200 OK




Дальше идет информация, которая различна для разных запросов. Как правило, это опять таки дата, тип сервера и т.д. Иногда веб-сервер может поместить в заголовок ответа следующую строчку:

Location: http://www.perl.ru/

Она указывает браузеру, что нужно немедленно идти по этому адресу, что собственно они все успешно и делают.
Далее я перечислю коды ответа браузера и их значения.

Обязательно должна присутствовать строчка:

Content-Type: text/html

указывающая тип переданных данных.

Ну и напоследок, список кодов возвращаемых веб-серверами и их значений

 Код статуса  Значение 
200OK
201Успешная команда POST
202Запрос принят
203    Запрос GET или HEAD выполнен
204Запрос выполнен но нет содержимого
300Ресурс обнаружен в нескольких местах
301Ресурс удален навсегда
302Ресурс отсутствует временно
304Ресурс был изменен
400Плохой запрос от клиента
401Неавторизованный запрос
402Необходима оплата за ресурс
403Доступ Запрещен
404Ресурс не найден
405Метод не применим для данного ресурса
406Недопустимый тип ресурса
410Ресурс Недоступен
500Внутренняя ошибка сервера
501Метод не выполнен
502Неисправный шлюз либо перегруз сервера
503Сервер недоступен/тайм-аут шлюза
504Вторичный шлюз/тайм-аут сервера
Philip A. Koryaka

e-mail:

Copyright c 2001


Содержание раздела