如何从Lua生成websocket握手?

问题描述:

在Lua中是否有一个现有的生成服务器响应密钥的函数?这里是蟒蛇的解决方案:websocket handshake problem如何从Lua生成websocket握手?

我有两个关键数字捕获,空间计算,第三串捕获并希望其余的就在于在现有的功能...

如果需要旧的握手(协议0),则可以使用下面的代码来从两个键获得握手值:

md5 = require 'md5' 

function getnumbers(str) 
    local num = "" 
    str:gsub('%d', function(d) num = num .. d end) 
    return tonumber(num) 
end 
function countspaces(str) 
    return select(2, str:gsub(' ', ' ')) 
end 
function to32bitint(i) 
    return string.char(i/256^3 % 256, i/256^2 % 256, i/256 % 256, i % 256) 
end 
function websocketresponse(key1, key2, end8) 
    local n1, s1 = getnumbers(key1), countspaces(key1) 
    local n2, s2 = getnumbers(key2), countspaces(key2) 
    local cat = to32bitint(n1/s1) .. to32bitint(n2/s2) .. ending8 
    return md5.sum(cat) 
end 

websocket_key1 = "18x 6]8vM;54 *(5: { U1]8 z [ 8" 
websocket_key2 = "1_ tx7X d < nw 334J702) 7]o}` 0" 
ending8 = "Tm[K T2u" 
print(websocketresponse(websocket_key1, websocket_key2, ending8)) 
--> fQJ,fN/4F4!~K~MH 

这产生了相同的值the protocol draft给出的例子。本示例使用MD5库来计算校验和,并可在LuaForWindows中编译。

为WebSocket协议版本6的实施是简单得多:

crypto = require 'crypto' 
mime = require 'mime' 

function websocketresponse6(key) 
    local magic = key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11" 
    return (mime.b64(crypto.digest('sha1', magic, true))) 
end 

key6 = "x3JJHMbDL1EzLkh9GBhXDw==" 
print(websocketresponse6(key6)) 
--> HSmrc0sMlYUkAGmm5OPpG2HaGWk= 

此示例使用从LuaSocket的LuaCrypto为SHA1之和MIME

+0

我在Windows应用程序中使用Lua。该分布不包括加密(或%数学运算符,但math.mod可以工作,以便解决部分问题)。有没有加密的工作? Safari和Mobile Safari都使用旧协议0. – shaun5 2012-02-19 16:52:57

+0

我不知道你正在使用哪个Lua发行版,但我想它是[Lua For Windows](http://code.google.com/p/luaforwindows/) )。它包含编译的[MD5](http://www.keplerproject.org/md5/manual.html#reference)库,我将更新它的代码。 – 2012-02-19 17:04:39

+0

我没有md5库。我不确定如何将其与仅在应用程序中可用的解释器一起添加。 (我已经要求开发人员添加任何一个库)。我可以修复这些(仅因为我理解这部分),但都不是** str:gsub('%d',function(d)num = num .. d end )**和** select(2,str:gsub('',''))**将在应用程序中执行... – shaun5 2012-02-19 18:11:01