HTTP: Требуется ли, чтобы заголовок Connection: Upgrade был первым, что обрабатывалось сервером? - PullRequest
0 голосов
/ 23 мая 2019

В протоколе http можно отправить заголовок с запросом вида Connection: Upgrade. Требуется ли серверу обрабатывать этот заголовок перед обработкой остальной части запроса?

т.е. должен ли сервер сначала обновить, а затем обработать запрос (например, GET), или он может обработать запрос, используя старый протокол, только после чего он обновляется до нового протокола?

Спецификация HTTP не ясна по этому поводу, но говорит следующее:

сразу после отправки 101 (Переключение протоколов) ответ, сервер, как ожидается, продолжит ответ на первоначальный запрос, как если бы он получил его эквивалентно новому протоколу (т. е. на сервере все еще невыполненный запрос на удовлетворение после изменения протокола, и, как ожидается, сделает это, не требуя запроса повторяется).

ref: https://tools.ietf.org/html/rfc7230#section-6.7

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

Context

Спецификация Websocket основана на HTTP. После Websocket rfc можно отправлять несколько заголовков Connection. В случае Connection: Upgrade, close это приводит к путанице. В случае, если upgrade ДОЛЖЕН идти первым, close всегда будет сброшено при успешном обновлении. Однако, если обновление может продолжаться в любое время, результат сервера будет неопределенным.

...