Сервер выдает ошибку http 400 после запроса рукопожатия WebSocket

Я пытаюсь создать библиотеку CometD с открытым исходным кодом на C, чтобы иметь возможность запускать клиент CometD практически на любом устройстве.

Техника Long_Polling для рукопожатия и связи с сервером выполнена, поэтому логически я должен предоставить пользователю опцию WebSocket.

Итак, я нашел Inter Web и наткнулся на библиотеку NoPoll. из части WebSocket.

Благодаря NoPoll теперь я могу добраться до сервера и постучать в его дверь, но когда я пытаюсь установить с ним рукопожатие, я всегда получаю эту ошибку 400:

Вот мое рукопожатие:

GET ws://m.zpush.ovh:8080/str/strd HTTP/1.1
Host: m.zpush.ovh:8080
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Extension: permessage-deflate;client_max_window_bits
Sec-WebSocket-Key: Z0WLawAAAADGI3syAAAAAA==
Origin: null
Cookie: BAYEUX_BROWSER=56a9-mchhnynonz6ji8a6hs1sh49; JSESSIONID=8gz8e00htqrl15vcm3o9yi95f
Sec-WebSocket-Version: 13

И вот ошибка Jetty:

WARN:oejh.HttpParser:qtp1213415012-14: badMessage: 400 for HttpChannelOverHttp@40ec53c2{r=0,c=false,a=IDLE,uri=-}

Итак, я снова залез в кибернет, но не нашел ни малейшего намека на это. Из того, что я читал, причал обычно дает более точные сообщения об ошибках, но вы согласитесь, что это очень размыто.

Это не говорит мне, почему и что я должен исправить, чтобы добиться рукопожатия. Но я подозреваю, что мне что-то не хватает в формате HandShake.

Другая вещь, которую я не понимаю, это то, что там написано «HttpParser», но я ищу рукопожатие WebSocket.

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

PS: я могу загрузить свой код на GitHub, если это необходимо, без проблем.

Спасибо за ваше время.


person Hakeem El Bakka-lee    schedule 27.05.2015    source источник


Ответы (1)


Скорее всего у вас неправильно настроен сервер, без поддержки WebSocket.

Я предлагаю вам запустить демонстрационный сервер CometD, как описано здесь, и попробовать свой C-клиент против этого.

Я только что попробовал ваш запрос на обновление (просто заменил имя хоста и порт), и он отлично работает.

person sbordet    schedule 27.05.2015
comment
Как всегда спасибо за ваши быстрые ответы. Что касается неправильной конфигурации сервера, я могу быть полностью прав, но у меня есть сомнения по этому поводу, поскольку он хорошо работает с Java и JavaScript, есть ли разница с запросом, поступающим от клиента C? Поскольку я отправляю свое рукопожатие по протоколу Tcp, а не по http. Спасибо за ваше время. - person Hakeem El Bakka-lee; 28.05.2015
comment
Я проверил ваше обновление через TCP с помощью telnet, и вы можете отправлять HTTP-запросы только через TCP, поэтому язык не проблема, если вы все сделаете правильно. - person sbordet; 28.05.2015