net.websocket.frames: Use struct packing in Lua 5.3 or struct lib if available
authorKim Alvefur <zash@zash.se>
Tue, 6 Oct 2015 16:05:27 +0000 (18:05 +0200)
committerKim Alvefur <zash@zash.se>
Tue, 6 Oct 2015 16:05:27 +0000 (18:05 +0200)
net/websocket/frames.lua

index 8528ab9946d97d8a8b198f7cf4b5831dffae6ea6..95e41479479cde2503697af54bc38767edd417bd 100644 (file)
@@ -22,6 +22,13 @@ local t_concat = table.concat;
 local s_byte = string.byte;
 local s_char= string.char;
 local s_sub = string.sub;
+local s_pack = string.pack;
+local s_unpack = string.unpack;
+
+if not s_pack and softreq"struct" then
+       s_pack = softreq"struct".pack;
+       s_unpack = softreq"struct".unpack;
+end
 
 local function read_uint16be(str, pos)
        local l1, l2 = s_byte(str, pos, pos+1);
@@ -46,6 +53,24 @@ local function pack_uint64be(x)
                get_byte(x, 24), get_byte(x, 16), get_byte(x, 8), band(x, 0xFF);
 end
 
+if s_pack then
+       function pack_uint16be(x)
+               return s_pack(">I2", x);
+       end
+       function pack_uint64be(x)
+               return s_pack(">I8", x);
+       end
+end
+
+if s_unpack then
+       function read_uint16be(str, pos)
+               return s_unpack(">I2", str, pos);
+       end
+       function read_uint64be(str, pos)
+               return s_unpack(">I8", str, pos);
+       end
+end
+
 local function parse_frame_header(frame)
        if #frame < 2 then return; end