Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Он должен использовать концы строк 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, и добавляю дополнительный заголовок, чтобы сервер закрывал соединение, но эти arent необходимы.

Ответ 2

если запрос: "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", тогда ответ содержит только заголовок и не тело, и соединение не будет закрыто после ответа.

Ответ 3

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

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

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

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

Счастливое кодирование

Ответ 4

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

GET /\r\n

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

Ответ 5

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

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

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

Ответ 6

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

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

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

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

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

Ответ 8

Действительно ДЕЙСТВИТЕЛЬНО ДАЛЬНЕЙШИЙ минимум, не использует netcat, но сам использует bash:

[email protected]:~$ exec 3<>/dev/tcp/127.0.0.1/80
[email protected]:~$ echo -e "GET / HTTP/1.1\n" >&3
[email protected]:~$ 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>
[email protected]:~$