remix (1119427), страница 2
Текст из файла (страница 2)
В общем случае, ресурсом может быть не толькофайл, но и любая информация, которая может быть программно сгенерирована и передана по протоколу TCP/IP. Ответ сервера обязательно содержиткод возврата, а также, возможно, и запрошенную информацию.Сайты, в которых информация (ресурсы) представляет собой наборфайлов (обычно — в формате HTML — т. н.
веб-страницы), называютсястатическими. Модельный веб-сервер, который требуется реализовать напервом этапе задания, поддерживает только статические сайты. Однаковозможности веб-серверов по-настоящему раскрываются только на динамических сайтах, в которых ресурсы могут генерироваться и обновляться программно (т.е. динамически) во время обработки клиентского запроса. Самаяпростая и ранняя технология поддержки динамических сайтов — CGI —описывается ниже. Реализация поддержки такой технологии в модельномсервере представляет собой второй этап задания.Особенностью HTTP-протокола, существенно упрощающей его реализацию, является т.н. отсутствие состояний.
Это означает, что веб-сервер необязан хранить историю запросов (хотя, конечно, может это делать в целяхоптимизации и т.д.). Кроме того, вся служебная 4информация передаетсяисключительно в текстовом виде (более того, в 7-битной кодировке ASCII).Кроме поддержки HTTP-протокола реальные веб-серверы выполняют имножество других функций: аутентификацию доступа к ресурсам, сбор ста7Основные понятиятистики запросов, поддержка защищенных соединений по протоколу HTTPSи т.д. Однако из соображений простоты в модельном веб-сервере эти функции не поддерживаются.Таким образом, основные понятия, связанные с веб-серверами, — этоURI, HTTP-запрос и HTTP-ответ.
Ниже мы рассмотрим эти понятия подробнее.3.1. Унифицированныйидентификатор ресурсаУнифицированный идентификатор ресурса (URI) — это строка символов(латиницы), которая определяет какой-либо ресурс (документ, изображение,службу и т.д.). Частным случаем URI является «Унифицированный локаторресурса» (URL), который определяет не только сам ресурс, но и его местонахождение в сети и/или на компьютере.Общий вид URI:‹схема› : ‹ссылка URI›‹схема› чаще всего обозначает сетевой протокол (http, https, ftp, mailtoи т. д.), но не только, например, схема file означает локальную файловуюсистему, схема ed2k — файлообменную сеть eDonkey и т.д.‹ссылка URI› обозначает непосредственный идентификатор ресурса,вид которого зависит от схемы.
Мы не будем рассматривать общий видссылки URI (равно как и полный список зарегистрированных схем —см. соответствующие стандарты [2]).Для модельного сервера сделаем два упрощения. Во-первых, будемсчитать, что модельный сервер допускает только ресурсы в виде файловданных или исполняемых файлов с CGI-программами (подробнее оCGI-программах и сценариях см.
ниже). Во-вторых, будем считать, что URIимеет следующую (упрощенную) структуру:‹схема›://‹хост›‹путь к файлу-ресурсу› [?‹параметры запроса›]Здесь ‹хост› указывает на адрес сайта в сети Интернет, возможновключающий в себя имя пользователя, пароль, порт (например, www.w3c.org,127.0.0.1:8888, anonymous:goga1234@www.mysite.ru:8080).
Общий вид задания хоста нас интересовать не будет, т.к. задачу выделения адреса хоста изURI берет на себя веб-клиент (например, браузер).Так, если пользователь вводит в адресной строке браузера URI следующего вида:http://127.0.0.1:8888/cgi-bin/testcgi?name=igor&surname=golovin&mail=igolovinто браузер выделяет схему (http), адрес веб-сервера (127.0.0.1:8888), устанавливает потоковое TCP/IP-соединение с сервером (в данном случае серверработает на той же машине, что и браузер, т.к.
адрес 127.0.0.1 — локальный)8Основные понятияи посылает серверу HTTP-запрос, который начинается со следующего заголовка (строки):GET cgi-bin/testcgi?name=igor&surname=golovin&mail=igolovinHTTP/1.0Таким образом, веб-сервер видит в запросе только часть URI , а именно:— ‹путь к файлу-ресурсу›;— ‹параметры запроса›.Для модельного веб-сервера ‹путь к файлу-ресурсу› — это корректныйпуть к запрашиваемому файлу-ресурсу, который начинается от «домашней»директории веб-сервера. Обычно такая директория задается в параметрахконфигурации веб-сервера, а для модельного сервера будем считать, что«домашняя» директория — это директория, откуда запущен веб-сервер.‹параметры запроса› — это последовательность пар «имя=значение»,разделенных знаком амперсанда &.Параметры запроса нужны только в случае, когда запрашиваемыйфайл-ресурс является исполняемой CGI-программой. В случае обычныхфайлов (HTML и т.п.) параметры не нужны.Сделаем важное замечание о кодировке URI.
По стандарту URI должензаписываться только латинскими символами (сейчас ведется работа постандартизации международного идентификатора ресурса (IRI), но она ещёне закончена). Символы национальных алфавитов (русского и т.д.), а такжеспециальные символы (пробелы, амперсанды, проценты, угловые скобки ит.п.) должны кодироваться латиницей (например, пробел кодируется последовательностью 3 символов %20). Для простоты анализа URI будем считать,что ни путь к файлу, ни строки в параметрах запроса не содержат русскихбукв и спецсимволов.
Потребуем, чтобы имена и значения содержали тольколатинские буквы и цифры. Таким образом, мы игнорируем проблемы кодировки URI.3.2. HTTP-запросHTTP-запрос отправляется веб-клиентом к веб-серверу и имеет вид:‹заголовок запроса> <конец строки›‹HTTP-заголовок> <конец строки›...‹HTTP-заголовок> <конец строки›‹конец строки›‹тело запроса›Здесь и далее ‹конец строки› — это символ с кодом 10 («\n»).Структура заголовка запроса имеет вид:‹HTTP-метод› ‹URI› HTTP/‹версия протокола›9Основные понятия‹версия протокола› — это 2 арабские цифры, разделенные точкой (версия.подверсия).
Сейчас используются версии HTTP-протокола 1.0 и 1.1.Структура URI описана выше.HTTP-метод определяет семантику запроса к серверу. Веб-сервер обязан поддерживать только два метода: GET и HEAD. Для простоты модельныйсервер будет поддерживать только их.3.2.3 Метод GETЭтот метод используется для запроса содержимого ресурса с сервера. Файлресурса определяется URI из запроса. Если URI корректен, то сервер обязанвернуть содержимое запрашиваемого файла, если это файл данных.
Если жефайл — это CGI-программа, то она запускается, ей передаются параметрызапроса из URI (они отделяются знаком вопроса), и сервер возвращает клиенту сгенерированный программой текст.Тело запроса для метода GET пусто.Недостатком метода GET является то, что параметры запроса явно передаются в адресной строке браузера и могут быть видны пользователю. Еслипараметры запросы включают приватную или конфиденциальную информацию (пароли, коды доступа и т.п.), то это может быть неприемлемо. Поэтому часто вместо метода GET используется метод POST, в заголовке которого URI не содержит параметров. Вместо этого параметры запроса передаются в теле сообщения. В модельном веб-сервере поддержка метода POSTне обязательна.Примеры заголовков запроса GET:GET /index.html HTTP/1.1По этому запросу сервер возвращает текст файла index.html из домашней директории сервера.GET /cgi-bin/testcgi?name=igor&surname=golovin&mail=igolovinHTTP/1.1По этому запросу сервер запускает программу cgi-bin/testcgi, передав ейпараметры запроса через переменную окружения.
Сгенерированный программой текст включается сервером в ответ клиенту (подробнее об этомсм. ниже в разделе «Общий шлюзовой интерфейс»).Особым случаем запроса GET является случай, когда URI не содержитпути к ресурсу (а только адрес сайта). Например, пользователь может набратьв адресной строке браузера:http://www.mysite.ru(заметим, что это типичный случай начала веб-серфинга).Браузер сгенерирует следующий заголовок запроса:10Основные понятияGET / HTTP/1.1Веб-сервер по этому запросу должен показать т.н.
главную страницусайта — страницу по умолчанию. Будем считать, что модельный сервер покажет в этом случае страницу с именем index.html из домашней директориисервера.3.2.4 Метод HEADМетод HEAD аналогичен методу GET с той разницей, что актуальное содержимое ресурса не передается клиенту. Сервер генерирует ответ, содержащий только заголовок ответа и HTTP-заголовки (тело ответа отсутствует).Метод HEAD используется веб-клиентами (браузерами) для проверки существования ресурса, извлечения метаданных (через HTTP-заголовки) и т.
д.Кроме того метод позволяет выяснить, не изменился ли ресурс со временипоследнего обращения к нему. Это очень важно, так как позволяет обеспечить кэширование ресурсов.Дело в том, что по стандарту HTTP-протокола метод GET считается«идемпотентным», то есть выдающим одинаковые результаты на одинаковыезапросы (при условии неизменности ресурса). Дата и время обновления ресурса указываются в ответе сервера на методы GET/HEAD (в HTTP-заголовкеLast-modified).