Как HTTP-сервер должен обрабатывать запросы, которые указывают протокол выше, чем HTTP/1.1?

Я создал HTTPS-сервер с нуля для использования во встроенном приложении.

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

Мой вопрос касается того, как сервер должен реагировать, когда он получает запрос с версией протокола HTTP выше 1.1. Я знаю, что 2.0 находится в стадии разработки, но я понятия не имею, когда мой сервер может видеть запросы с номером версии выше, чем 1.1. Очевидно, сейчас самое время сделать это на будущее.

Если предположить, что сервер в наибольшей степени соответствует только RFC2616 (HTTP 1.1), будет ли правильный ответ на запрос с протоколом выше 1.1 отвечать на HTTP/1.1 и затем обрабатывать транзакцию как HTTP 1.1?

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

Я снова перечитал RFC2616 для получения инструкций по этому вопросу, в частности, раздел 3:

http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html

Но из этого я не могу понять, как серверное приложение должно реагировать на будущую версию HTTP.

Другой вариант, о котором я знаю, это ответить 505 HTTP Version Not Supported, Предположительно, я мог бы вернуть это, если получу запрос с версией выше, чем HTTP/1.1. Я полагаю, что в этом случае любой будущий браузер предпримет еще одну попытку с более низким номером версии HTTP, например HTTP/1.1.

1 ответ

Я использую telnet в терминале Linux, чтобы набирать мои собственные необработанные HTTP-запросы с различными версиями HTTP. Вот что я нахожу:

Запросы к серверу Microsoft IIS 7.5:

GET / HTTP/1.2 в результате сервер отвечает нормально, с HTTP/1.1.

GET / HTTP/1.1234 в результате сервер отвечает нормально, с HTTP/1.1.

GET / HTTP/2.0 в результате сервер отвечает HTTP/1.1 505 HTTP Version Not Supported,

Затем я попробовал против сервера Apache. Это ведет себя по-другому в том, что он всегда отвечает счастливо (например, HTTP 200) с HTTP/1.1 даже если основная HTTP-версия в запросе больше 1. Она будет обслуживать задние страницы (а не выбрасывать 505), даже если я использовал версию HTTP, такую ​​как 3.1234.

Итак, в соответствии с тем, как ведут себя серверы IIS и Apache:

  • Пока основной номер версии HTTP равен 1, запрос должен обрабатываться, если младший номер версии больше 1 (например, 1.2, 1.1234), но в ответе должно быть указано HTTP/1.1,

  • Если основной номер версии HTTP не равен 1, решение о том, вернусь ли я, зависит от меня 505 HTTP Version Not Supported или обработать запрос на HTTP/1.1, Для простоты я сделаю последнее.

Другие вопросы по тегам