Я изучаю некоторые сети и у меня проблемы с первым упражнением:
Я должен отправить простой 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

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

1 ответ1

4

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

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

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

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

HTTP/1.1 200 OK
Connection: keep-alive
Server: meinheld/0.6.1
Date: Tue, 09 Jan 2018 22:01:19 GMT
Content-Type: application/json
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true
X-Powered-By: Flask
X-Processed-Time: 0.000454902648926
Content-Length: 32
Via: 1.1 vegur

{
  "origin": "[My IPv4 address redacted]"
}

^]
telnet> close
$ 

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .