Как 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
, Для простоты я сделаю последнее.