Что, по крайней мере, требуется для HTTP-запроса?
Я пытаюсь выдать команду GET моему локальному серверу с помощью netcat
, выполнив следующие действия:
echo -e "GET / HTTP/1.1\nHost: localhost" | nc localhost 80
К сожалению, для этого я получил ответ HTTP/1.1 400 Bad Request
. Что, по крайней мере, требуется для HTTP-запроса?
Ответы
Ответ 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 ошибок.
Ответ 7
Вы должны добавить пустую строку: \r\n\r\n
http://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol#Client_request
Ответ 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]:~$