Разбор заголовков Connection в HTTP как списка токенов через запятую
Разбирайте каждый параметр Connection без учёта регистра, когда прямой прокси встречает keep-alive и Upgrade в одном поле HTTP/1.1.
Эти значения не являются конкурирующими написаниями одного режима:
Connection: Upgrade
Connection: keep-alive, Upgrade
Второе перечисляет два параметра соединения. HTTP определяет Connection как список через запятую, причём имена параметров нечувствительны к регистру. Код, сравнивающий всё значение с точной строкой Upgrade, пропускает допустимый список, содержащий этот параметр.
При обычной пересылке HTTP-посредник разбирает входящее поле, удаляет поля, названные его параметрами, а затем удаляет сам Connection или заменяет его собственными управляющими параметрами для дальнейшего соединения.
Удаления только жёстко заданного поля Keep-Alive недостаточно. Сообщение может назвать в списке другое поле, специфичное для соединения, и это поле не должно попасть в обычную пересылку.
Поддержка обновления протокола требует осознанной обработки двух соединений и нового протокола. Слепое копирование входящих заголовков Upgrade не является реализацией такой передачи.
Когда один браузер работает, а другой нет, сравните фактические значения поля по обе стороны посредника. Разница между одним токеном и списком из двух токенов может выявить ошибку разбора, не требуя от браузера имитировать точное форматирование другого браузера.
Это касается HTTP-сообщений, которые разбирает прокси. Обычный туннель HTTPS CONNECT не раскрывает этому прокси поле Connection зашифрованного сайта.