2015-07-04 4 views
1

Я дошел до того, что у меня нет другого места, где можно было бы искать и находилось в этом в течение 2 дней.Websockets Sec-WebSocket-Accept недействителен в Vala

Я пытаюсь реализовать серверную часть для веб-узлов в Вала. Я слежу за RFC here, а также пытался конвертировать примеры из других языков.

string res = "HTTP/1.1 101 Switching Protocols" + "\r\n" 
      + "Connection: Upgrade" + "\r\n" 
      + "Upgrade: websocket" + "\r\n" 
      + "Sec-WebSocket-Accept: " + Base64.encode(Checksum.compute_for_string(ChecksumType.SHA1, 
       Regex.split_simple("Sec-WebSocket-Key: (.*)", request)[1].strip() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
      ).data;) 
      + "\r\n\r\n"; 

Выход из моего кода Vala отличается от выходов C# и PHP. Ключ отправлен в мой браузер:

y/WXsXKM98if/+AUaqF6iQ== 

PHP и C# дать мне следующий результат:

ZGZhMTEyNjkxNDBkNGQ4YzlmOGFmNjZmYzEzN2UxOThlOGM0ZDRlYg== 

Вала дает мне следующий результат:

ZmRjODM1ODQwNDNmOTM5ODAzY2Q5MzJhMjE4NzQyYmQ2YmRkOWQ1 

Я не думаю, это как-то связано с кодированием строк, поскольку C# и Vala используют одну и ту же стандартную кодировку. Я предположил, что это связано с нулевым байтом в конце массива данных, но я проверил и не существует.

Любой совет будет здорово

Редактировать

Наконец получил выход в Vala, совпадающее PHP и C#. Я забыл добавить к GUID, но это не объясняет, почему я получаю это в Chrome

failed: Error during WebSocket handshake: Incorrect 'Sec-WebSocket-Accept' header value 
+1

Есть ли причина, по которой вы пытаетесь написать все это самостоятельно, а не просто использовать поддержку websocket, встроенную в libsoup? https://developer.gnome.org/libsoup/stable/libsoup-2.4-WebSockets.html – nemequ

+0

Я даже не знал, что у Libsoup была поддержка websocket. Все это началось с того, что я хотел настроить сервер для поддержки веб-узлов. Сервер уже работал с другими клиентами. Я посмотрю, могу ли я легко сбросить libsoup там. –

+0

Вы также должны опубликовать свое редактирование в качестве ответа и принять его, чтобы сохранить чистоту. – nemequ

ответ

1

Вся проблема заключалась в том, что выход SHA1 я использовал был сбежавший HEX строки, а не сырой двоичный выход.

Checksum cs = new Checksum(ChecksumType.SHA1); 
cs.update(_base.data, -1); 
cs.update("258EAFA5-E914-47DA-95CA-C5AB0DC85B11".data, -1); 

size_t len = 20; 
uint8[] digest = new uint8[len]; 
cs.get_digest(digest, ref len); 
string key = Base64.encode(digest); 

Нашли ответ, просмотрев Libsoup.