2017-02-19 25 views
2

При попытке подключиться к локальный (с терминала), я получил этот ответ:HTTP/1.1 426 Требуется обновление

HTTP/1.1 426 Требуется обновление
Сервер: WebSocket ++/0.3.0-альфа-4

Как я могу ответить на это, чтобы обновить?

+0

Что именно представляет собой запрос? И ответ приходит с ответным телом? –

+0

Привет, Джулиан, я пытаюсь подключиться к localhost для запуска приложения. Я использовал командную строку «netstat -atp tcp | grep -i» listen », чтобы выяснить, какой номер порта я должен использовать, и терминал возвратил несколько локальных хостов. Я использовал curl -v http: // localhost: [NUMBER]/и первый номер локального хоста, который я попробовал, возвратил сообщение:

ответ

4

Вы четко подключения к серверу WebSocket, а не простой сервер HTTP

Сервер: WebSocket ++/0.3.0-альфа-4

В WebSocket protocol начинается с HTTP- когда клиент запрашивает у сервера разрешение на обновление связи для полнодуплексного обмена сообщениями WebSocket.

Ответ 426 означает, что первоначальное рукопожатие не требует правильного обновления WebSocket. Per RFC 6455 Section 4.1 Client Requirements:

После того, как соединение с сервером было установлено (в том числе подключения через прокси-сервер или через TLS-шифрованный туннель), то клиент должен послать открывающее квитирование на сервер. Рукопожатие состоит из запроса HTTP Upgrade, а также списка обязательных и необязательных полей заголовка. Требования для этого рукопожатия заключаются в следующем.

  1. Рукопожатие ДОЛЖНО быть действительным HTTP-запросом, указанным в [RFC2616].

  2. Метод запроса ДОЛЖЕН быть GET, а версия HTTP ДОЛЖНА быть как минимум 1,1.

    Например, если URI WebSocket является «ws: //example.com/chat», первой переданной строкой должна быть «GET/chat HTTP/1.1».

  3. Часть запроса «URI-запрос» должна соответствовать имени/ресурсу/определенному в разделе 3 (относительный URI) или быть абсолютным URI http/https, который при анализе имеет имя/ресурс/,/host/и/port /, которые соответствуют соответствующему URI ws/wss.

  4. Запрос ДОЛЖЕН содержать | Host | поле заголовка, значение которого содержит/host/plus опционально «:», за которым следует/port/(если не используется порт по умолчанию).

  5. Запрос ДОЛЖЕН содержать | поле заголовка, значение которого ДОЛЖНО включать ключевое слово «websocket».

  6. Запрос ДОЛЖЕН содержать соединение | поле заголовка, значение которого ДОЛЖНО включать токен «Обновление».

  7. Запрос ДОЛЖЕН содержать поле заголовка с именем | Sec-WebSocket-Key |. Значение этого поля заголовка ДОЛЖНО быть необязательным, состоящим из случайно выбранного 16-байтового значения, которое было закодировано в base64 (см. Раздел 4 в [RFC4648]). Функция nonce ДОЛЖНА быть выбрана случайным образом для каждого соединения.

    Примечание: В качестве примера, если случайно выбранное значение была последовательность байт 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0B 0x0a 0x0c 0x0d 0x0E 0x10 0x0F, значение поля заголовка будет "AQIDBAUGBwgJCgsMDQ4PEC =="

  8. Запрос ДОЛЖЕН содержать поле заголовка с именем | Начало | [RFC6454], если запрос поступает от клиента браузера. Если соединение происходит от клиента без браузера, запрос МОЖЕТ включать это поле заголовка, если семантика этого клиента соответствует описанному здесь прецеденту для клиентов браузера. Значение этого поля заголовка - это сериализация ASCII начала контекста, в котором работает код, устанавливающий соединение. См. [RFC6454] для подробностей о том, как построено это значение поля заголовка.

    В качестве примера, если код, загруженный с www.example.com, пытается установить соединение с ww2.example.com, значение поля заголовка будет «http://www.example.com».

  9. Запрос ДОЛЖЕН содержать поле заголовка с именем | Sec-WebSocket-Version |. Значение этого поля заголовка ДОЛЖНО быть равно 13.

    ПРИМЕЧАНИЕ. Несмотря на то, что были опубликованы черновики версии этого документа (-09, -10, -11 и -12) (они в основном состояли из редакционных изменений и пояснений, а не изменения в проводном протоколе), значения 9, 10, 11 и 12 не использовались в качестве допустимых значений для Sec-WebSocket-Version. Эти значения были зарезервированы в реестре IANA, но не использовались и не будут использоваться.

  10. Запрос МОЖЕТ включать поле заголовка с именем | Sec-WebSocket-Protocol |. Если присутствует, это значение указывает один или несколько подпротоколов, разделенных запятыми, которые клиент хочет говорить, упорядочиваясь по предпочтению. Элементы, которые содержат это значение, ДОЛЖНЫ быть непустыми строками с символами в диапазоне U + 0021 до U + 007E, не включая символы разделителя, как определено в [RFC2616], и ДОЛЖНЫ все быть уникальными строками. ABNF для значения этого поля заголовка - это 1 # токен, где определения конструкций и правил приведены в [RFC2616].

  11. Запрос МОЖЕТ включать поле заголовка с именем | Sec-WebSocket-Extensions |. Если присутствует, это значение указывает расширение (-ы) уровня протокола, на котором клиент хочет говорить. Интерпретация и формат этого поля заголовка описаны в разделе 9.1.

  12. Запрос МОЖЕТ включать любые другие поля заголовка, например, файлы cookie [RFC6265] и/или поля заголовка, связанные с аутентификацией, такие как | Авторизация | заголовок поля [RFC2616], которые обрабатываются в соответствии с документами, которые их определяют.

После того, как сообщение об открытии клиента было отправлено, клиент ДОЛЖЕН ждать ответа от сервера перед отправкой каких-либо дополнительных данных.

Клиент должен проверить ответ сервера следующим образом:

  1. Если код состояния, полученный от сервера не 101, клиент обрабатывает ответ за HTTP [RFC2616] процедур. В частности, клиент может выполнить аутентификацию, если он получает код состояния 401; сервер может перенаправить клиента, используя код состояния 3xx (но клиенты не обязаны следовать им) и т. д. В противном случае действуйте следующим образом.

  2. Если в ответе отсутствует | Обновление | поле заголовка или | Обновить | заголовочное поле содержит значение, которое не соответствует ASCII-регистрозависимому совпадению для значения «websocket», клиент MUST Не удалось подключиться к WebSocket Connection.

  3. Если в ответе отсутствует соединение | заголовок или соединение | заголовок не содержит токен, который является ASCII-регистро-независимым совпадением для значения «Обновление», клиент MUST Не удалось подключиться к WebSocket Connection.

  4. Если в ответе отсутствует | Sec-WebSocket-Accept | заголовочного поля или | Sec-WebSocket-Accept | содержит значение, отличное от SHA-1, основанного на base64, конкатенации | Sec-WebSocket-Key | (как строка, а не base64-декодированная) со строкой «258EAFA5-E914-47DA-95CA-C5AB0DC85B11», но игнорируя любые ведущие и конечные пробелы, клиент ДОЛЖЕН Не удалось подключиться к WebSocket.

  5. Если ответ включает в себя | Sec-WebSocket-Extensions | заголовок поля, и это поле заголовка указывает на использование расширения, отсутствовавшего в рукопожатии клиента (сервер указал расширение, не запрошенное клиентом), клиент MUST Не удалось установить соединение с WebSocket. (Разбор этого поля заголовка для определения того, какие расширения запрашиваются, обсуждается в разделе 9.1.)

  6. Если ответ включает в себя | Sec-WebSocket-Protocol | заголовок поля, и это поле заголовка указывает на использование подпротокола, отсутствовавшего в рукопожатии клиента (сервер указал на подпротокол, не запрошенный клиентом), клиент MUST Не удалось установить соединение с WebSocket.

Если ответ сервера не соответствует требованиям, предъявляемым к рукопожатия сервера, как определено в данном разделе и в разделе 4.2.2, клиент должен о сбое WebSocket Connection.

Обратите внимание, что в соответствии с [RFC2616] все имена полей заголовка в как HTTP-запросы, так и ответы HTTP не чувствительны к регистру.

Если ответ сервера подтвержден, как указано выше, сообщается, что Установлено соединение WebSocket и что соединение WebSocket находится в состоянии ОТКРЫТО.