Websockets Sec-WebSocket-Accept 在 Vala 中无效
Websockets Sec-WebSocket-Accept invalid in 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
整个问题是我使用的 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 找到了答案。
我已经到了无处可寻的地步,我已经在这里待了 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
整个问题是我使用的 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 找到了答案。