Pull to refresh

Comments 35

то нажмите Ctrl + «]», и затем ввод
В случае telnet 1.9.2 из gnuinetutils это не поможет. После ctrl+] стоит набрать q или quit и нажать enter.
Нет, " Ctrl + C" в telnet не работает и не должно.
Nginx на ctrl+c отреагирует и разорвет соединение, но в общем случае оно не работает. Telnet в это случае отправляет ff f4 ff fd 06, что приводит к HTTP 400 и закрытию сокета сервером.
Но это — нарушение стандарта. И вообще, использовать telnet для HTTP — некошерно. netcat рулит.
А как сервер должен реагировать на мусор вместо HTTP запроса? 400 выглядит вполне релевантным кодом.
Для этого и ctrl нажимать не надо, достаточно одного символа. valplo резонно заметил, что ctrl+c в telnet не работает как SIGINT.
Это известно. Telnet, как минимум, сообщает свою escape-последовательность (ctrl+]) при запуске. Остальное летит по сети)
Да я не о том. Обрывать коннект через 400 — нарушение стандарта.
Всегда считал, что при ошибке в синтаксисе запроса 400 отдавать нормально. Может где-то проглядел. Приведите, пожалуйста, цитату из стандарта, как надо реагировать на мусор на входе.
Извиняюсь, я не так выразился.
Я хочу сказать, что клиент не должен добиваться 400 чтобы оборвать соединение. Со стороны сервера — все нормально.
Конечно не работает, давно телнетом не пользовался, извиняюсь.
заголовок Host, который является обязательным
Это неточно. Он не является обязательным. Но по нему веб-сервер может изменять поведение (так реализуются виртуальные хосты, например). Также часть сайтов, например, может не отдавать контент при отсутствии заголовка Referrer, но это не делает его обязательным.
A client MUST include a Host header field in all HTTP/1.1 request messages. If the requested URI does not include an Internet host name for the service being requested, then the Host header field MUST be given with an empty value.
Спасибо, был неправ. И сервер обязан отдать 400 при отсутствии Host и не absoluteURI.
Начиная с HTTP/1.1 этот заголовок уже является обязательным.
При этом учитывайте, что после объявления последнего заголовка необходимо добавить два переноса строки.
Опять неточность. Заголовки по RFC2616 разделяются не просто «переносом строки», а комбинацией CRLF. При этом в секции 19.3 указано, что желательно, чтобы сервер корректно обрабатывал вариант с просто LF, а так же с горизонтальными табами и пробелами в качестве разделителей строки запроса.
19.3 Tolerant Applications

Although this document specifies the requirements for the generation
of HTTP/1.1 messages, not all applications will be correct in their
implementation. We therefore recommend that operational applications
be tolerant of deviations whenever those deviations can be
interpreted unambiguously.

Clients SHOULD be tolerant in parsing the Status-Line and servers
tolerant when parsing the Request-Line. In particular, they SHOULD
accept any amount of SP or HT characters between fields, even though
only a single SP is required
.

The line terminator for message-header fields is the sequence CRLF.
However, we recommend that applications, when parsing such headers,
recognize a single LF as a line terminator and ignore the leading CR.
О, спасибо! Внесу в статью.

И вообще спасибо вам большое, что проверили — получается, что вместе создаём для новичков таким образом качественный материал.
Не за что. Как видите выше, я не знал о некоторых изменения с HTTP/1.0 =)
Лично для меня наиболее простое описание протокола HTTP выглядит примерно так: HTPP есть протокол с тремя основными частями а) управляющим заголовком, являющимся обычным текстом; б) разделителем; в) данными. Управляющий заголовок формируется по достаточно простыми правилам, описанным в стандарте.

То есть ничего там очень мудрённого нет — весь протокол по-сути строится вокруг управляющего заголовка, который является простым текстом. Сформировал управляющий заголовок, записал его в байтовый массив, записал туда же разделитель + совершенно произвольные данные (кстати и бинарные данные тоже) — и вот тебе пакет для передачи поверх TCP (например). Далее сокет на передачу, сокет на приём и так далее.

На мой взгляд надо реально обращать внимание новичков, что HTTP — это очень просто для создания и использования. Что в простейших случаях написать программу работующую через HTTP является делом скажем часа. Что ничего там сложного нет — сложности могут появиться только в достаточно редких случаях. Что в качестве данных в данном протоколе может быть не только HTML, а любые данные, в том числе и бинарные. И так далее.
А на самом деле такое отношение к протоколам вредно и недопустимо. Стандарты описывают тьму разных corner cases, в каждом из которых можно накосячить и получить глючную реализацию клиента или сервера. Знание протоколов на элементарном уровне полезно только для того, чтобы можно было глазами посмотреть на дамп протокола и понять, что вообще происходит. Для реализации же клиентов и серверов лучше всего использовать популярные и проверенные библиотеки.
Мне 37 лет и я программирую около 15 лет (профессионально). В частности был причастен к поддержке полного стека протоколов SS7. Что такое протоколы и их реализации я знаю прекрасно.

Просто я ещё раз хочу сказать — основой современного Web являются простые текстовые протоколы. Ничего там сложного нет. Нет нужды запугивать какой-то сложностью. Проверенные библиотеки всего лишь предложать правильно сформировать по-сути текстовый файл — не более того.

Пишите собственные библиотеки — быстро поймёте как всё просто.
Соглашусь с тем, что запугивать никого не надо и бояться не надо — в HTTP ничего сверхъестественного нет.

Но не соглашусь, что «пишите библиотеки — поймете, как всё просто». На самом деле, всё обстоит как раз наоборот. Начинаешь писать библиотеки, а потом в дикой природе сталкиваешься с ситуациями: "#птыть, а это что за фигню браузер XXX прислал? Ох ни хрена себе, это же chunked encoding в запросе, а я его не поддерживаю!", «Эээ… а почему браузер YYY не воспринимает вот этот вот заголовок? Аа, в нём кириллица, которую разные браузеры декодируют по разному. По стандарту надо было кодировать в RFC2047, а я это профукал», «А если в запросе Content-encoding: gzip, а Transfer-encoding: chunked, то сначала надо компрессировать, а потом на чанки разбивать или наоборот?», «А вот это что за фигня? Ни хрена себе — оказывается, если строка заголовка начинается с пробела, значит надо пробелы откинуть и считать её продолжением предыдущей строки», «А все пробелы надо откидывать или только один?»

Всегда, ВСЕГДА старайтесь использовать готовые проверенные реализации протоколов, покуда это возможно. Даже если у вас целых 15 лет профессионального опыта.
Разговор уходит в другое русло. Я говорю, что HTTP — это очень просто для использования и понимания, а вы — про необходимость использования каких-то библиотек. Пользуйтесь чем угодно, только вот новичкам давайте возможность изучить начальный протокол, а не какую-то доверенную библиотеку по работе с ним.

Изучайте первичное знание — только так можно поднять свой профессиональный уровень. А то потом будете великим знатоком проверенных библиотек и более никем.
Изучать надо всё. А вот когда использовать в продакшне — не надо советовать новичкам писать свои реализации с нуля. Не портите новичков.
Всё зависит от задач «продакшена». Иногда нужно использовать библиотеки, иногда — писать собственные реализации.
Заканчивайте обобщать.
немножко оффтоп:
В своё время написал простенький IRC клиент, так потом сидел в ирц через телнет и мнил себя крутым хакером.))
ЗЫ: действительно многие протоколы обычно текстовые и не вызывают особых проблем в реализации, хотя по своей ленивой природе предпочитаю пользоваться уже готовыми решениями.
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Наверное, было бы еще полезным дописать как отправляются данные через POST.
Дописать «по разному»? Вариантов-то выше крыши, лучше сразу читать RFC2616…
Ну если исходить из этого, то про работу HTTP тоже можно прочитать в мануалах.

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

Sign up to leave a comment.

Articles