Какой код состояния HTTP наиболее подходит для возврата, когда клиент указывает HTTP/1.0 в рукопожатии при открытии веб-сокета?

Согласно RFC WebSocket ( RFC6455 # section-4.2.1):

Если сервер во время чтения рукопожатия обнаружит, что клиент не отправил рукопожатие, соответствующее описанию ниже [...], сервер ДОЛЖЕН прекратить обработку рукопожатия клиента и вернуть ответ HTTP с соответствующим кодом ошибки (например, ошибка 400, неверный запрос).

  1. Запрос HTTP/1.1 или выше GET, включая "Request-URI" [RFC2616], который следует интерпретировать как / имя ресурса / определенный в разделе 3 (или абсолютный URI HTTP / HTTPS, содержащий / имя ресурса /).

[так далее...]

Когда вместо этого указывается клиентское рукопожатие HTTP/1.0 (или, возможно, еще более низкий номер версии?), я не уверен, отвечая с HTTP/1.1 400 \r\n\r\n уместно с учетом его определения ( RFC7231 # section-6.5.1):

Код состояния 400 (неверный запрос) указывает на то, что сервер не может или не будет обрабатывать запрос из-за чего-то, что воспринимается как ошибка клиента (например, синтаксис искаженного запроса, формирование кадра сообщения о недействительном запросе или обманчивая маршрутизация запроса).

Я полагаю, что слишком малый номер версии HTTP следует считать ошибкой клиента, зависит от того, как интерпретировать сообщение рукопожатия клиента:

Или...

  • Клиентское рукопожатие - это простое сообщение HTTP1.1 (которое может привести к будущему обновлению до WebSocket, если оно включает определенный набор заголовков HTTP).

...или же...

  • Сообщение о рукопожатии клиента на самом деле не является сообщением HTTP1.1, а фактически является сообщением, которое является частью стандарта WebSocket и которое просто маскируется под сообщение HTTP1.1.

Если последнее, код состояния 400 имеет смысл, потому что клиент явно нарушает стандарт WebSocket.

Если первое, код состояния 400 не имеет смысла, потому что сообщение является действительным как сообщение HTTP; и код состояния 505 может быть предпочтительным: ( RFC7231 # section-6.6.6)

Код состояния 505 (версия HTTP не поддерживается) указывает, что сервер не поддерживает или отказывается поддерживать основную версию HTTP, которая использовалась в сообщении запроса. Сервер указывает, что он не может или не хочет выполнить запрос, используя ту же основную версию, что и клиент, как описано в Разделе 2.6 [RFC7230], за исключением этого сообщения об ошибке. Серверу СЛЕДУЕТ генерировать представление для ответа 505, которое описывает, почему эта версия не поддерживается и какие другие протоколы поддерживаются этим сервером.

Опять же, мне не нравится идея возврата кода состояния класса 5XX, потому что он более или менее предполагает, что сервер виноват в выдаче ошибки...

РЕДАКТИРОВАТЬ: Как я упоминаю в комментарии ниже, большая часть двусмысленности, вероятно, возникает из-за того, что я не проверяю, собирался ли клиент вообще обновиться до WebSocket.

0 ответов

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