определение версии HTTP с использованием необработанных сокетов в C

0

Я пытаюсь создать сырые сокеты в C/C++, затем создать сообщение запроса и затем отправить это сообщение на целевой сервер. Если порт, который я укажу, составляет 80 я хочу отправить HTTP-запрос для определения HTTP-версии, которую использует целевой сервер. Например, я отправляю GET HTTP/1.0 на www.google.com.

Для некоторых серверов он возвращает HTTP/1.1 400 запрос HTTP/1.1 400. Хотя в некоторых случаях он отвечает XML-сообщением. Я знаю, что команда GET неверна, так как я не указываю ни одного объекта, на самом деле GET. Так есть общий способ сделать это?

Теги:
sockets
http

3 ответа

2

Пытаться:

HEAD / HTTP/1.0\r\n
\r\n

Или:

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

Первая строка ответа сервера должна содержать версию HTTP. Обратите внимание, что некоторые серверы возвращают 400 Bad Request если Host: <hostname> опущен из заголовка (который не требуется в 1.0, но в 1.1). Я бы сделал:

Пытаться:

HEAD / HTTP/1.0\r\n
Host: <hostname>\r\n
\r\n

Или:

GET / HTTP/1.0\r\n
Host: <hostname>\r\n
\r\n

Если вам не требуется тело сообщения, вы должны использовать HEAD как для этого потребуется меньше данных.

  • 0
    Обратите внимание, я не думаю, что символы \r необходимы; спецификация HTTP позволяет им, но все в порядке только с \n .
1

Вам придется постепенно попробовать каждую версию HTTP. Например, если я запрашиваю google.com с HTTP 1.0, он будет отвечать HTTP 1.0:

$ printf "HEAD / HTTP/1.0\nHost: google.com\n\n" | nc google.com 80
HTTP/1.0 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2013 19:44:42 GMT
Expires: Thu, 26 Dec 2013 19:44:42 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic

Если я запрошу его с HTTP 1.1, он ответит HTTP 1.1:

$ printf "HEAD / HTTP/1.1\nHost: google.com\n\n" | nc google.com 80
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Nov 2013 19:44:47 GMT
Expires: Thu, 26 Dec 2013 19:44:47 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic
1
GET / HTTP/1.0\r\n
Host: www.google.com\r\n
\r\n

Это базовый HTTP-запрос. В качестве альтернативы вы можете использовать HEAD вместо GET, так как вам нужны заголовки, но некоторые базовые серверы не распознают HEAD как допустимый метод.

Не каждый сервер будет поддерживать HTTP/1.0, они, скорее всего, проигнорируют это и ответят как HTTP/1.1, другие просто принесут версию в вашем запросе и на самом деле не означают.

Это может быть неприятно пытаться определить версию HTTP на случайном сервере. Возможно, вам стоит вместо этого использовать 1.1 в запросе и посмотреть, отвечает ли сервер на 1.0, я считаю, что это самый безопасный способ узнать, хватит ли на нем сервера.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню