Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
92.67 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Кафедра МОЭВМ

Сетевые технологии.

Отчет по лабораторной работе №3

Реализация HTTP клиента.

Выполнил:

Студент гр.3351

Сергеев М.В.

Санкт-Петербург

2007г.

  1. Постановка задачи

HTTP — протокол прикладного уровня. Обмен сообщениями идёт по обыкновенной схеме «запрос-ответ». Для идентификации ресурсов HTTP использует глобальные URI. В отличие от многих других протоколов, HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». Компоненты, использующие HTTP, могут самостоятельно осуществлять сохранение информации о состоянии, связанной с последними запросами и ответами. Браузер, посылающий запросы, может отслеживать задержки ответов. Сервер может хранить IP-адреса и заголовки запросов последних клиентов. Однако сам протокол не осведомлён о предыдущих запросах и ответах, в нём не предусмотрена внутренняя поддержка состояния, к нему не предъявляются такие требования.

Каждое HTTP-сообщение состоит из трёх частей, которые передаются в указанном порядке:

  1. Стартовая строка (англ. Starting line) — определяет тип сообщения;

  2. Заголовки (англ. Headers) — характеризуют тело сообщения, параметры передачи и прочие сведения;

  3. Тело сообщения (англ. 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&param2=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

  1. Проект реализации

Так как протокол HTTP не предусматривает промежуточных состояний, то у программы клиента будет только одно состояние: «готовность отправки запроса».

Программа должна:

  1. создать сокет и инициализировать соединение с сервером

  2. запросить у пользователя тип запроса

  3. обработать запрос:

    1. сформировать запрос

    2. если это запрос с авторизацией:

      1. запросить у пользователя логин и пароль

      2. закодировать полученные логии и пароль в base64

      3. полученный код добавить в запрос

    3. отправить запрос серверу

    4. получить ответ сервера

  4. вывести ответ сервера на экран и в файл

  1. Описание реализации

Программа состоит из следующих функций:

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

  1. Фрагменты листинга

Функция посылки запроса 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];

  1. Тестовые примеры

Метод 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 }

...

5