// codeart.ru / Главная / HTTP протокол - это просто

HTTP протокол - это просто

Автор: Evgeny Sergeev

Сегодня хочу рассказать о том, как я начинал изучать основы HTTP протокола, прибегая к мануалам только в крайних случаях. Точно уже и не помню с какой целью мне понадобилось узнать как же все работает на самом деле, то ли я хотел заспамить какой-то провинившийся форум, то ли у меня были более благородные цели (хотя что может быть благороднее чем заспамить неугодный форум?). Так или иначе, в моей голове созрела мысль: нужно узнать, как работает HTTP протокол.

Все мои попытки обсудить эту тему на форумах заканчивались тем, что меня посылали к мануалам или значительно дальше. В итоге, я сдался и решил заняться самостоятельным изучением вопроса.

Честно говоря, чтение мануалов никогда не входило в число моих сильных сторон, обычно на второй или третьей странице меня начинает клонить в сон, а после десятой бороться с этим желанием просто нет сил. После нескольких попыток прочитать мануал я рассудил так: коли браузер может отправлять нужные HTTP заголовки (HTTP headers), то надо стырить у него эти заголовки, а не клевать носом над бесконечной документацией. Проявив немного смекалки, я нашел очень простой способ как получить желаемое.

Допустим мне нужно узнать, какой POST запрос формирует браузер при отсылке заполненной веб-формы. Тогда, чтобы узнать всю интересующую меня информацию можно использовать снифер, а можно сделать сделать так:

1. Создаеть небольшой скрипт на PHP, который будет запускаться на локальной машине для прослушки 80-го порта. Особенность скрипта в том, что он вываливает все полученные данные на экран, ничего не утаивая от моего пытливого взора;
2. В браузере открыть страницу с интересующей нас веб-формой ( это должно быть что-то на подобии http://www.some-url.com/webform.html);
3. Заполнить все поля формы;
4. Открыть файл hosts (в ОС Linux данный файл находится по адресу /ets/hosts, а в Windows ищите сами, бог знает куда ушлые ребята из Мелкософта могли его засунуть. Кто найдет, может отписаться в комментарии! :-))) ). В конец файла нужно дописать: 127.0.0.1 www.some-url.com
5. Вернуться в браузер и нажать кнопку “Отправить” (или какая там кнопка предусмотрена для отправки формы)

Собственно это все! В результате, наивный браузер отправит форму не на www.some-url.com, а нашему скрипту, который, в свою очередь, все отобразит на экране. Нам останется только проанализировать полученные данные (тут уж без мануала не обойтись, но, согласитесь, гораздо проще посмотреть пару тройку параметров, чем шерстить несколько десятков страниц).

Вероятно вы зададите вопрос, есть ли другие способы получить заголовки? Конечно есть, например, можно использовать снифер, или, скажем, специальные плагины для любимого барузера. Но мой метод тоже очень хорош, и вот почему:
1. Он простой! Даже первоклассник без труда сможет проделать все описываемые процедуры;
2. Он независим от браузера, в конечном итоге не браузерами одними жив HTTP протокол, есть еще RSS-ридеры и другие подобные программы;
3. Он кросплатформенный, безусловный плюс!
4. Он позволяет получить заголовки “как есть” и перенести в свою программу простым копи-пастом;
5. Он открывает обширные возможности для анализа и экспериментирования;

Правда есть один существенный недостаток - многие браузеры кэшируют ответ DNS сервера и при повторных обращениях к сайту используют значение полученное при первом обращении. Поэтому, когда меняешь содержимое файла hosts требуется перезапустить браузер либо подождать когда истечет время жизни кэша (время жизни кэша для FireFox по-умолчанию - одна минута).

В заключение привожу текст скрипта на PHP, слушающего 80-ый порт:

set_time_limit (0); $address = '127.0.0.1'; $port = 80; $sock = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($sock, $address, $port) or die('Could not bind to address'); socket_listen($sock); while(1) {         $client = socket_accept($sock);         $input = socket_read($client, 1024);         echo $input;         socket_write($client, $output);         socket_close($client); } socket_close($sock);

Собственно, это все.

Хочется напомнить, что Акция “Провокация” продолжается, и в начале следующего месяца будет опубликован новый список блогов, давших наименьший трафик. Кроме этого, напоминаю, что любая статья на этом блоге может быть использована на других ресурсах, только с указанием ссылки на данный блог!

  1. Элементарно, Ватсон! :)
    C:\Windows\system32\drivers\etc\

  2. Олег, вот я и говорю, запрячут вечно куда-то, а ты потом ищи :-)

  3. Эт точно. В Виндовсе все через задний проход :)

  4. эхх)) эт да!

    поршлый траффик был 40% всего моего траффика… хм..

  5. Да, интересная заметка. Пожалуй, возьму себе на вооружение.

  6. Очень удобно смотреть заголовки в FF с помощью плагинчика Live HTTP Headers

  7. Женя, firebug отменили? (:

  8. dkrnl, нет не отменили, но во-первых я так делал очень очень давно, когда еще не знал про файрбаг, во-вторых, мне интересно смотреть не только файрвоксовые заголовки, но и Ослика, Оперы, RSS ридеров, и т.д. В-третьих так можно смотреть и заголовки при отправке почты, меняя порт естественно. В-четвертых, разобраться во всем без посредников, гораздо интереснее (лично для меня по крайней мере).

    GTAlex, Если говорить о FireBug и Live HTTP Headers (и то и то у меня установлено), то по сравнению с ними (в контексте статьи, естественно) гораздо удобнее работать со снифером.

  9. Трекбэк! Отличный скрипт )))

  10. Буквально неделю-две назад писал абсолютно аналогичный скрипт на Groovy.
    http://voituk.kiev.ua/http-echo-server-in-10-lines-of-code.html
    Уместился в 10 строк :)

  11. Вадим, хе… красиво! :-)

  12. @Evgeny Sergeev
    Я потому и с этим Groovy “играюсь” - много вещей очень реализуется элегантно и вычурно :)

  13. Хоть и неоднократно описано, но попрежнему актуально и позновательно.
    Побольше информативных постов :)

  14. За смекалку 5 баллов!
    Но сам подход, кажется мне не верным. Зато, хоть как-то, объясняет кривость многих нынешних программ - несоответствие разным спецификациям, еще бы, если их даже не читают :-)

  15. А я смотрю все пересылаемые данные, и перехватываю их, в плагине Tamper Data к FF.

    Очень удобная штука :)

  16. Сразу задается вопрос автору… А что такое content-range ну или хотя-бы boundary - вы знаете? Я уж не задаю великий вопрос - сколько видов HTTP аутентификации существует, чем они отличаются, и для чего вообще придумывались…

    Поэтому тут я с вами не соглашусь, читать RFC надо, в любом случае. Чем-бы вы не пользовались. Отступы от RFC создают новые стандарты, и как правило более глючные чем их предшественники.

  17. “Сразу задается вопрос автору… А что такое content-range ну или хотя-бы boundary - вы знаете? Я уж не задаю великий вопрос - сколько видов HTTP аутентификации существует, чем они отличаются, и для чего вообще придумывались”

    Увы, не знаю ни что такое content-range или boundary, а так же сколько видов аутентификации существует.

    Скажу больше, не помню сколько всего статус кодов существует и не знаю всех их расшифровок. Методы “PUT”, “DELETE” и им подобные, тоже ни разу не использовал…

    Если сказать короче - я не знаю RFC наизусть. Более того, я скорее всего никогда не буду знать наизусть ни одного RFC. ;-)

    Но, разве это что-то меняет в сказанном выше?

Leave a Reply

« IE+PNG - причина моих колебаний Интересное на сегодня »