|   | 
 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: [email protected] | 
 e-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
 
  указывающая тип переданных данных.
 
 
  Ну и напоследок, список кодов возвращаемых веб-серверами и их значений
 
 
 
 |  Код статуса  |  Значение  |  | 200 | OK |  | 201 | Успешная команда POST |  | 202 | Запрос принят |  | 203 |     Запрос GET или HEAD выполнен |  | 204 | Запрос выполнен но нет содержимого |  | 300 | Ресурс обнаружен в нескольких местах |  | 301 | Ресурс удален навсегда |  | 302 | Ресурс отсутствует временно |  | 304 | Ресурс был изменен |  | 400 | Плохой запрос от клиента |  | 401 | Неавторизованный запрос |  | 402 | Необходима оплата за ресурс |  | 403 | Доступ Запрещен |  | 404 | Ресурс не найден |  | 405 | Метод не применим для данного ресурса |  | 406 | Недопустимый тип ресурса |  | 410 | Ресурс Недоступен |  | 500 | Внутренняя ошибка сервера
  |  | 501 | Метод не выполнен |  | 502 | Неисправный шлюз либо перегруз сервера |  | 503 | Сервер недоступен/тайм-аут шлюза |  | 504 | Вторичный шлюз/тайм-аут сервера |  
 
  
 | 
  |