Получение ответа «400 Bad Request» на простой HTTP-запрос GET через telnet

3071
Pierre Cathé

Я изучаю некоторые сети и у меня возникают проблемы с первым упражнением:
я должен отправить простой HTTP-запрос GET на httpbin.org с помощью telnet.
Вот что я напечатал:

$ telnet www.httpbin.org 80 Trying 23.23.171.5... Connected to www.httpbin.org.herokudns.com. Escape character is '^]'. GET /ip HTTP/1.0 

и вот что я получаю:

HTTP/1.1 400 Bad Request Server: Cowboy Date: Tue, 09 Jan 2018 20:06:36 GMT Content-Length: 0 

Что я делаю неправильно?

0

1 ответ на вопрос

4
Spiff

Проблема заключается в использовании HTTP 1.0 на сервере, который требует HTTP 1.1 (и Host:заголовок, который является обязательной частью HTTP 1.1), возможно, потому что он, вероятно, делает виртуальный хостинг нескольких веб-сайтов на одном IP-адресе. Или, может быть, он находится за HTTP-балансировщиком нагрузки или обратным прокси-сервером, который делает одно и то же: поддерживает несколько отдельных доменных имен веб-сервера за одним IP-адресом и портом.

Это работает для меня:

$ telnet www.httpbin.org 80 Пытаюсь 23.23.171.5 ... Подключен к www.httpbin.org.herokudns.com. Escape-символ '^]'. GET / IP HTTP / 1,1 Ведущий: www.httpbin.org  

... и я вернусь ...

HTTP / 1.1 200 ОК Подключение: keep-alive Сервер: meinheld / 0.6.1 Дата: вт, 09 января 2018 22:01:19 GMT Тип контента: приложение / JSON Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: правда X-Powered-By: Flask X-Processed-Time: 0.000454902648926 Длина контента: 32 Через: 1.1 Вегур  { "origin": "[Мой адрес IPv4 отредактирован]" }  ^] telnet> закрыть $  

Обратите внимание, что соединение оставалось открытым, и мне пришлось бежать, telnet>чтобы закрыть окно. Я мог бы избежать этого, добавив Connection: closeзаголовок к моему запросу.

Если вы используете HTTP / 1.1 с Host:заголовком, и он все еще не работает для вас, убедитесь, что ваш клиент telnet отправляет CRLF, а не только возврат каретки или перевод строки. Убедитесь, что вы завершили свой запрос дополнительным CRLF после последней строки.

CRLF имеет решающее значение здесь. Мне не нужно было использовать заголовок User-Agent. pbies 5 лет назад 0