Html WebSocket Sec WebSocket Accept在Vala中无效

Html WebSocket Sec WebSocket Accept在Vala中无效,html,websocket,vala,Html,Websocket,Vala,我已经到了没有其他地方可以搜索的地步,并且已经在这里呆了两天了 我正在尝试在Vala中实现WebSocket的服务器端。我一直在关注RFC,并尝试从其他语言转换示例 string res = "HTTP/1.1 101 Switching Protocols" + "\r\n" + "Connection: Upgrade" + "\r\n" + "Upgrade: websocket" + "\r\n" + "Sec-We

我已经到了没有其他地方可以搜索的地步,并且已经在这里呆了两天了

我正在尝试在Vala中实现WebSocket的服务器端。我一直在关注RFC,并尝试从其他语言转换示例

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
Vala给了我以下结果:

ZGZhMTEyNjkxNDBkNGQ4YzlmOGFmNjZmYzEzN2UxOThlOGM0ZDRlYg==
ZmRjODM1ODQwNDNmOTM5ODAzY2Q5MzJhMjE4NzQyYmQ2YmRkOWQ1
我认为这与字符串编码无关,因为C#和Vala都使用相同的默认编码。我假设这与数据数组末尾的空字节有关,但我已经检查过了,没有空字节

任何建议都很好

编辑

最终在vala中获得了与PHP和C#匹配的输出。我忘了附加GUID,但这并不能解释为什么我要在Chrome中添加GUID

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

整个问题是我使用的SHA1输出是转义的十六进制字符串,而不是原始的二进制输出

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找到了答案。

您为什么要自己编写这些内容,而不只是使用Libsoup中内置的websocket支持?我甚至不知道Libsoup有websocket支持。开始的整个过程就是我想调整服务器以支持WebSocket。服务器已在与其他客户端一起运行。我会看看是否可以轻松地将libsoup放在那里。你也应该将你的编辑作为答案发布并接受它,只是为了保持整洁。我先试用libsoup,看看是否适合我。此项目中的文件量将花费少量时间。