Структура запроса.
Рассмотрим, из чего состоит HTTP запрос. Все достаточно просто. Начнем с того, что HTTP запрос ? это вполне осмысленный текст. Из чего же он состоит в общем случае? Будем рассматривать протокол HTTP 1.0. Итак:
Request-Line [ General-Header | Request-Header | Entity-Header ]\r\n[ Entity-Body ]
- Request-Line ? строка запроса
Формат: "Method Request-URI HTTP-Version\r\n"
Method ? метод, которым будет обрабатываться ресурс Request-URI, может быть GET, POST, PUT, DELETE или HEAD.
Request-URI ? относительная или абсолютная ссылка на страницу с набором параметров, например, /index.html или http://www.myhost.ru/index.html или /index.html?a=1&b=qq. В последнем случае серверу будет передан запрос с набором переменных a и b с соответствующими значениями, а знак "&" ? амперсант служит разделителем между параметрами.
HTTP-Version ? версия HTTP протокола, в нашем случае "HTTP/1.0".
Нам крайне интересны методы обработки GET и POST. Методом GET можно просто передать параметры в скрипт, а методом POST можно эмулировать submit формы.
Для метода GET, Request-URI может выглядеть, например, так: "/index.html?param1=1¶m2=2".
- General-Header ? главная часть заголовка.
Формат: [Date: value\n | Pragma: no-cache\n]
Может иметь только два параметра: Date или Pragma. Date ? дата по Гринвичу в формате "День недели, Число Месяц Год ЧЧ:ММ:СС GMT", например, "Tue, 15 Nov 1994 08:12:31 GMT" ? дата создания запроса. Pragma может иметь одно значение no-cache, которое запрещает кэширование страницы.
Request-Header ? часть заголовка, описывающая запрос.
Request-Header может иметь следующие параметры: Allow, Authorization, From, If-Modified-Since, Referer, User-Agent.
В данной главе мы не будем рассматривать параметр Autorization, так как он используется для доступа к закрытым ресурсам, что требуется не так уж часто. Вы можете самостоятельно изучить формирование заголовка для авторизованного доступа на сайте www.w3c.org.
Allow ? задает допустимые методы обработки.
Формат: "Allow: GET | HEAD\n".
Параметр игнорируется при указании метода обработки POST в Request-Line. Задает допустимые методы обработки запроса. Прокси сервера не модифицируют параметр Allow и он в неизменном виде доходит до сервера.
From ? e-mail адрес, пославшего запрос.
Формат: "From: adderss\r\n".
Например, "From: myname@mailserver.ru\r\n".
If-Modified-Since ? указывает, что запрос не модифицировался с такого-то времени.
Формат: "If-Modified-Since: date\r\n"
Используется только для метода обработки GET. Дата указывается по Гринвичу в таком же формате, как и для параметра Date в General-Header.
Referrer ? абсолютная ссылка на страницу, с которой произошла инициация запроса, т. е. ссылка на страницу, с которой пользователь перешел на нашу.
Формат: "Referrer: url\n".
Пример: "Referrer: www.host.ru/index.html\n".
User-Agent ? тип браузера.
Например: "User-Agent: Mozilla/4.0\n"
Entity-Header ? часть заголовка, описывающая данные Entity-Body.
В данной части запроса задаются параметры, которые описывают тело страницы. Entity-Header может содержать следующие параметры: Allow, Content-Encoding, Content-Length, Content-Type, Expires, Last-Modified, extension-header.
Allow ? параметр аналогичный Allow из General-Header.
Content-Encoding ? тип кодирования данных Entity-Body.
Формат: "Сontent-Encoding: x-gzip | x-compress | другой тип\n".
Пример: "Сontent-Encoding: x-gzip\n". Символ "|" означает слово "или", то есть то или то или то и.т.д.
Другой тип может указывать на способ кодирования данных, например, для метода POST: "Сontent-Encoding: application/x-www-form-urlencoded\n".
Content-Length ? количество байт, пересылаемых в Entity-Body. Значение Content-Length имеет совсем другой смысл для данных, пересылаемых в формате MIME, где он выступает как параметр описания части данных ? "external/entity-body". Допустимыми являются целые числа от нуля и больше.
Пример: "Content-Length: 26457\n".
Content-Type ? тип передаваемых данных.
Например: "Content-Type: text/html\n".
Expires ? Время, когда страница должна быть удалена из кэша браузера.
Формат: "Expires: date\n". Формат даты алогичен формату даты для параметра Date из General-Header.
Last-Modified ? время последнего изменения пересылаемых данных.
Формат: "Last-Modified: date\n". Формат даты алогичен формату даты для параметра Date из General-Header.
Extention-header ? часть заголовка, которая может предназначаться, например, для обработки браузером, или другой программой, которая принимает документ. В данной части можно описывать свои параметры в формате "ParameterName: parametervalue\n". Данные параметры будут игнорироваться, если программа-клиент не знает, как их обработать.
Например: "Cookie: r=1\r\n" ? устанавливает всем известные печеньки для страницы.
А теперь после таких страшных слов давайте попробуем немного успокоиться и понять, что же нам надо? Понимать мы естественно будем на примерах.
Давайте представим, что нам надо получить страницу с сайта, передав Cookies (Печеньки), иначе нас просто пошлют как незванных гостей, и более того, известно, что на данную страницу пускают только после того, как Вы побывали на главной странице сайта.