Что, по крайней мере, требуется для HTTP-запроса?


Я пытаюсь выдать команду GET на мой локальный сервер с помощью netcat следующим образом:

echo -e "GET / HTTP/1.1nHost: localhost" | nc localhost 80

к сожалению, я получаю HTTP/1.1 400 Bad Request ответ на этот. Что, как минимум, требуется для HTTP-запроса?

8 57

8 ответов:

Он должен использовать окончание строки CRLF, и он должен заканчиваться в \r\n\r\n, т. е. пустую строку. Вот что я использую:

printf 'GET / HTTP/1.1\r\nHost: www.example.com\r\nConnection: close\r\n\r\n' |
  nc www.example.com 80

кроме того, я предпочитаю printf over echo, и я добавляю дополнительный заголовок, чтобы сервер закрыл соединение, но они не нужны.

если запрос: "GET / HTTP/1.0\r\n\r\n" ответ содержит заголовок, а также тела, и соединение закрывается после ответа.

если запрос:"GET / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" затем ответ содержит заголовок, а также тело, и соединение закрывается после ответа.

если запрос:"GET / HTTP/1.1\r\nHost: host:port\r\n\r\n" тогда ответ содержит заголовок, а также тело, и соединение не будет закрываться даже после ответа.

если ваш запрос: "GET /\r\n\r\n" ответ не содержит заголовка и только тело, и соединение закрывается после ответа.

если ваш запрос: "HEAD / HTTP/1.0\r\n\r\n" ответ содержит только заголовок и нет тела, и соединение закрывается после ответа.

если запрос: "HEAD / HTTP/1.1\r\nHost: host:port\r\nConnection: close\r\n\r\n" ответ содержит только заголовок и нет тела, и соединение закрывается после ответа.

если запрос: "HEAD / HTTP/1.1\r\nHost: host:port\r\n\r\n" ответ содержит только заголовок и нет тела, и соединение не будет закрыто после ответа.

я смог получить ответ от моего сервера Apache с только запрошенный документ, без заголовка ответа, только с

GET /\r\n

Если вам нужны заголовки ответов, включая код состояния, вам нужен один из других ответов здесь.

посмотреть Wiki: HTTP-запрос клиента (пример).

обратите внимание на следующее:

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

абсолютный минимум (если удаление Хоста разрешено ;-) тогда GET / HTTP/1.0\r\n\r\n.

удачи в кодировании

факт 400 Bad Request сама ошибка не означает, что ваш запрос нарушает HTTP. Сервер очень хорошо может дать этот ответ по другой причине.

насколько я знаю, абсолютный минимальный допустимый HTTP-запрос:

GET / HTTP/1.0\r\n\r\n

пожалуйста, пожалуйста, пожалуйста, не реализуйте свой собственный HTTP-клиент без предварительного чтения соответствующих спецификаций. Пожалуйста, прочитайте и убедитесь, что вы полностью поняли, по крайней мере RFC 2616. (И если вы амбициозны, RFC 7230 через 7235).

хотя HTTP выглядит как простой протокол, на самом деле есть несколько тонких моментов об этом. Любой, кто написал HTTP-сервер, расскажет вам о обходных путях, которые он должен был реализовать, чтобы справиться с неправильным, но широко развернутые клиенты. Если вы не читаете спецификации, пожалуйста, используйте хорошо зарекомендовавшую себя клиентскую библиотеку;Curl - это хороший выбор, но я уверен, что есть и другие.

Если вы собираетесь реализовать собственный:

  • не используйте HTTP / 0.9;
  • HTTP / 1.0 требует строку запроса и пустую строку;
  • в HTTP / 1.1, является обязательным в дополнение к вышесказанному.

опуская Host: заголовок в HTTP / 1.1 является наиболее распространенной причиной 400 ошибок.

вы должны добавить пустую строку: \r\n\r\n

http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request

действительно действительно голый минимум, не использует netcat, но использует сам bash:

user@localhost:~$ exec 3<>/dev/tcp/127.0.0.1/80
user@localhost:~$ echo -e "GET / HTTP/1.1\n" >&3
user@localhost:~$ cat <&3
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/2.7.6
Date: Mon, 13 Oct 2014 17:55:55 GMT
Content-type: text/html; charset=UTF-8
Content-Length: 514

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><html>
<title>Directory listing for /</title>
<body>
<h2>Directory listing for /</h2>
<hr>
<ul>
</ul>
<hr>
</body>
</html>
user@localhost:~$