Websockets Sec-WebSocket-Accept在Vala中无效

时间:2015-07-04 18:06:26

标签: html5 websocket vala

我已经到了没有其他地方可以搜索并且在这里待了2天的地步。

我正在尝试在Vala中为Websockets实现服务器端。我一直关注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==

Vala给了我以下结果:

ZmRjODM1ODQwNDNmOTM5ODAzY2Q5MzJhMjE4NzQyYmQ2YmRkOWQ1

我不认为这与字符串编码有关,因为C#和Vala都使用相同的默认编码。我认为它与数据数组末尾的空字节有关,但是我已经检查过并且没有一个。

任何建议都会很棒

修改

最后得到了vala中的输出以匹配PHP和C#的输出。我忘了附加GUID但是,这并不能解释为什么我会在Chrome中添加它

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

1 个答案:

答案 0 :(得分: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找到答案。