|
что не позволяйте столь досадному факту ввести себя в
заблуждение, когда будете в сценарии использовать переменную окружения
HTTP_REFERER.
Content-length
r Формат: Content-length: длина
r Переменная окружения: CONTENT_LENGTH
Заголовок содержит строку, являющуюся десятичным представлением длины данных
в байтах, передаваемых методом POST. Если задействуется метод GET, то этот
заго-
ловок отсутствует, и значит, переменная окружения не устанавливается.
Cookie
r Формат: Cookie: значения_Cookies
r Переменная окружения: HTTP_COOKIE
Здесь хранятся все Cookies в URL-кодировке (о Cookies мы подробнее поговорим в
следующей главе).
Часть I. Основы Web-программирования 34
Accept
r Формат: Accept: text/html, text/plain, image/gif, image/jpeg
r Переменная окружения: HTTP_ACCEPT
В этом заголовке браузер перечисляет, какие типы документов он "понимает".
Пере-
числение идет через запятую. К сожалению, в последнее время браузеры стали не-
сколько небрежны и часто присылают в этом заголовке значение */*, что
обозначает
любой тип.
Существует еще множество заголовков запроса (часть из них востребуются только
протоколом HTTP 1.1), но мы не будем на них задерживаться.
Эмуляция браузера через telnet
Между прочим, при передаче запроса браузер "притворяется" пользователем, кото-
рый запустил telnet-клиента (программу, которая, грубо говоря, умеет
подключаться к
заданному IP-адресу и порту, посылать по нему то, что набирается на клавиатуре,
и
отображать на экране поступающие "снаружи" данные) и вводит строки заголовков
вручную — т. е., в текстовом виде. Например, вместо того чтобы набрать в
браузере
http://www.somehost.com/, попробуйте в командной строке ОС (Unix, Windows
95/98/NT/2000 или любой другой) выполнить следующие команды (вместо
нажимая соответствующую клавишу):
telnet www.somehost.com 80
GET /index.html HTTP/1.0
Вы увидите, как перед вами промелькнут строки HTML-документа index.html.
Очень рекомендую проделать описанную процедуру, чтобы избавиться от духа мис-
тицизма при упоминании о протоколе HTTP. Все это не так сложно, как иногда
может
показаться.
Если у вас указанная процедура не удалась, и сервер все время шлет сообще-
ние "Bad Request", то проверьте регистр символов, в котором вы набираете
команды. Все буквы должны быть заглавными, а название протокола
HTTP/1.0 — идти без пробелов.
Посмотрим теперь, как работает сервер. А происходит все следующим образом: он
считывает все заголовки запроса и дожидается маркера "\n\n" (или, что то же
самое,
"пустого" заголовка), а как только его получает, начинает разбираться — что же
ему
за информация пришла, и выполнять соответствующие действия.
С помощью заголовков реализуются такие механизмы, как контроль кодировок,
Cookies, метод POST и т. д. Если же сервер не понимает какого-то заголовка, он
его
Глава 2. Интерфейс CGI 35
либо пропускает, либо жалуется отправителю (в зависимости от воли администрато-
ра, который настраивал сервер).
Метод POST
Мы подошли к сути метода POST. А что, если мы в предыдущем примере зададим
вместо GET слово POST и после последнего заголовка (маркера \n\n) начнем
переда-
вать какие-то данные? В этом случае сервер их воспримет и также передаст сцена-
рию. Только нужно не забыть проставить заголовок Content-length в соответствии
с размером данных, например:
POST /script.cgi HTTP/1.0\n
Content-length: 5\n
\n
Test!
Сервер начнет обработку запроса, не дожидаясь передачи данных после маркера
кон-
ца заголовков. Иными словами, сценарий запустится сразу же после отправки \n\n,
а
уж ждать или не ждать, пока придет строка Test! длиной 5 байтов — его дело.
Последнее означает, что сервер никак не интерпретирует POST-данные (точно так
же,
как он не интерпретирует некоторые заголовки), а пересылает их непосредственно
сценарию. Но как же сценарий
|
|