Лабораторная работа 3 / Lab3
.docСанкт-Петербургский государственный электротехнический университет
Кафедра МОЭВМ
Сетевые технологии.
Отчет по лабораторной работе №3
Реализация HTTP клиента.
Выполнил:
Студент гр.3351
Сергеев М.В.
Санкт-Петербург
2007г.
-
Постановка задачи
HTTP — протокол прикладного уровня. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами. Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования.
Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:
-
Стартовая строка (англ. Starting line) — определяет тип сообщения;
-
Заголовки (англ. Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения;
-
Тело сообщения (англ. Message Body) — непосредственно данные сообщения.
Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа.
Стартовые строки различаются для запроса и ответа. Строка запроса выглядит так:
Метод URI HTTP/Версия
Здесь:
URI определяет путь к запрашиваемому документу.
Метод (англ. Method) — английское слово в верхнем регистре, указывающее тип запроса.
Версия (англ. Version) — пара разделённых точкой арабских цифр. Например: 1.0.
Стартовая строка ответа сервера имеет следующий формат:
HTTP/Версия КодСостояния Пояснение
Здесь:
Версия — пара разделённых точкой арабских цифр как в запросе.
КодСостояния (англ. Status Code) — три арабские цифры. По коду статуса определяется дальнейшее содержимое сообщение и поведение клиента.
Пояснение (англ. Reason Phrase) — текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.
Методы, используемые в данной лабораторной работе:
OPTIONS
Возвращает методы HTTP, которые поддерживаются сервером. Этот метод может служить для определения возможностей веб-сервера.
GET
Запрашивает содержимое указанного ресурса. Запрашиваемый ресурс может принимать параметры (например, поисковая система может принимать в качестве параметра искомую строку). Они передаются в строке URI (например: http://www.example.net/resource?param1=value1¶m2=value2). Согласно стандарту HTTP, запросы типа GET считаются идемпотентными — многократное повторение одного и того же запроса GET должно приводить к одинаковым результатам (при условии, что сам ресурс не изменился за время между запросами). Это позволяет кэшировать ответы на запросы GET.
HEAD
Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело. Это полезно для извлечения мета-информации, заданной в заголовках ответа, без пересылки всего содержимого.
Так же в данной лабораторной работе реализуется базовая схема авторизации на сайте. "Базовая" схема установления подлинности основана на том, что агент пользователя должен доказывать свою подлинность при помощи идентификатора пользователя (user-ID) и пароля (password). Чтобы получить права доступа, клиент посылает в заголовке Authorization идентификатор пользователя (userid) и пароль (password), разделенные одним символом двоеточия (":"), внутри base64-кодированной строки рекомендаций (credentials).
RFC
Спецификация HTTP/1.0 (Май 1996) RFC 1945
http://tools.ietf.org/html/rfc1945
Спецификация HTTP/1.1 (Июнь 1999) RFC 2616
http://tools.ietf.org/html/rfc2616
-
Проект реализации
Так как протокол HTTP не предусматривает промежуточных состояний, то у программы клиента будет только одно состояние: «готовность отправки запроса».
Программа должна:
-
создать сокет и инициализировать соединение с сервером
-
запросить у пользователя тип запроса
-
обработать запрос:
-
сформировать запрос
-
если это запрос с авторизацией:
-
запросить у пользователя логин и пароль
-
закодировать полученные логии и пароль в base64
-
полученный код добавить в запрос
-
-
отправить запрос серверу
-
получить ответ сервера
-
-
вывести ответ сервера на экран и в файл
-
Описание реализации
Программа состоит из следующих функций:
int init_connection ()
-
Вызывается непосредственно из main. Инициализирует соединение с сервером и формирует HTTP запросы.
-
Запрашивает у пользователя тип HTTP запроса, а так же логин и пароль в случае запроса с авторизацией.
-
Вызывает функцию http_send для отправки запроса и получения ответа сервера.
-
Вызывает функцию Base64Encode для кодирования логина и пароля в случае запроса с авторизацией.
void http_send(SOCKET sock)
-
посылает HTTP запрос и получает ответа сервера
unsigned long Base64Encode( void* dest, const void* src, unsigned long size )
-
кодирует логин и пароль в base64
-
Фрагменты листинга
Функция посылки запроса HTTP и получение ответа сервера
void http_send(SOCKET sock)
{
report(false,buf); // выводнаэкрантекстазапроса
send(sock,buf,strlen(buf),0); // оправка запроса серверу
ZeroMemory(buf,HTTP_BUFSIZ); // очистка буфера
recv(sock,buf,HTTP_BUFSIZ,0); // получение ответа на запрос
report(true,buf); // выводнаэкранрезультатазапроса
}
Фрагмент функции формирования HTTP запроса
switch(ch)
{
case 1:
sprintf(buf,"GET / HTTP/1.1\nHost: test.ru\n\n\n");
// pravilniy zapros
break;
case 2:
sprintf(buf,"GET /goo.htm HTTP/1.1\nHost: test.ru\n\n\n");
break;
case 3:
sprintf(buf,"HEAD / HTTP/1.1\nHost: test.ru\n\n\n");
// HEAD
break;
case 4:
sprintf(buf,"OPTIONS / HTTP/1.1\nHost:test.ru\n\n\n");
// OPTIONS
break;
case 5:
sprintf(buf,"GET / HTTP/0\nHost: test.ru\n");
// Bad Request
break;
case 6:
sprintf(buf,"lalala\n");
// Method Not Implemented
break;
case 7:
printf("Login: ");
scanf ("%s",usr);
printf("Pass: ");
scanf ("%s",pwd);
char base64[100];
-
Тестовые примеры
Метод OPTIONS
1: GET / HTTP/1.1/nHost: test.ru // pravilniy zapros
2: GET /goo.htm HTTP/1.1/nHost: test.ru // pravilniy zapros
3: HEAD / HTTP/1.1/nHost: test.ru // HEAD
4: OPTIONS / HTTP/1.1/nHost:test.ru // OPTIONS
5: GET / HTTP/0/nHost: test.ru // Bad Request
6: lalala // Method Not Implemented
7: GET /pass/index.htm HTTP/1.1/nHost: test.ru
Authorization: Basic PASS // Login to site
8:EXIT
option: 4
HTTP client: OPTIONS / HTTP/1.1
Host:test.ru
HTTP server: HTTP/1.1 200 OK
Date: Mon, 17 Dec 2007 10:10:42 GMT
Server: Apache/1.3.33 (Win32) PHP/4.4.4
Content-Length: 0
Allow: GET, HEAD, POST, PUT, DELETE, CONNECT, OPTIONS, PATCH, PROPFIND, PROPPATC
H, MKCOL, COPY, MOVE, LOCK, UNLOCK, TRACE
Метод GET с авторизацией
1: GET / HTTP/1.1/nHost: test.ru // pravilniy zapros
2: GET /goo.htm HTTP/1.1/nHost: test.ru // pravilniy zapros
3: HEAD / HTTP/1.1/nHost: test.ru // HEAD
4: OPTIONS / HTTP/1.1/nHost:test.ru // OPTIONS
5: GET / HTTP/0/nHost: test.ru // Bad Request
6: lalala // Method Not Implemented
7: GET /pass/index.htm HTTP/1.1/nHost: test.ru
Authorization: Basic PASS // Login to site
8:EXIT
option: 7
Login: username
Pass: 123456
HTTP client: GET /pass/index.htm HTTP/1.1
Host: test.ru
Authorization: Basic dXNlcm5hbWU6MTIzNDU2
HTTP server: HTTP/1.1 200 OK
Date: Mon, 17 Dec 2007 10:12:51 GMT
Server: Apache/1.3.33 (Win32) PHP/4.4.4
Last-Modified: Sun, 25 Nov 2007 15:59:44 GMT
ETag: "0-a18-47499bf0"
Accept-Ranges: bytes
Content-Length: 2584
Content-Type: text/html
<BASE HREF="/dbbroswer/biomint/restricted/">
<HTML>
<HEAD>
<TITLE>BioMinT: Biological Text Mining. Restricted Area</TITLE>
</HEAD>
<style TYPE="text/css">
<!--
A:link { color: #FFFF85 }
...