Я создал 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#sec3
Но из этого я не могу понять, как серверное приложение должно реагировать на будущую версию HTTP.
Другой вариант, о котором я знаю, - это ответить 505 HTTP Version Not Supported
. Предположительно, я мог бы вернуть это, если получу запрос с версией выше, чем HTTP / 1.1. Я предполагаю, что это заставит любой будущий браузер предпринять еще одну попытку с более низким номером версии HTTP, например, HTTP / 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
. Для простоты я сделаю последнее.