Назад | Перейти на главную страницу

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