aboutsummaryrefslogtreecommitdiffstats
path: root/net/websocket/frames.lua
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2022-03-06 15:13:50 +0100
committerKim Alvefur <zash@zash.se>2022-03-06 15:13:50 +0100
commitece896d2532cc91ea95c0194e3db439c364235eb (patch)
tree390268df5b0a7045135b3c4a75aa8ec42627490d /net/websocket/frames.lua
parent9a86373fd190698bca380abce15d07fbdbde0890 (diff)
downloadprosody-ece896d2532cc91ea95c0194e3db439c364235eb.tar.gz
prosody-ece896d2532cc91ea95c0194e3db439c364235eb.zip
net.websocket.frames: Replace bit fiddling code with util.struct
Fallback code for not having either the string.pack and string.unpack functions available in Lua 5.4 or the struct lib is no longer needed since the struct lib was imported as util.struct in 3ce3633527af
Diffstat (limited to 'net/websocket/frames.lua')
-rw-r--r--net/websocket/frames.lua61
1 files changed, 13 insertions, 48 deletions
diff --git a/net/websocket/frames.lua b/net/websocket/frames.lua
index 03ce21a8..6a088902 100644
--- a/net/websocket/frames.lua
+++ b/net/websocket/frames.lua
@@ -6,71 +6,36 @@
-- COPYING file in the source package for more information.
--
-local softreq = require "util.dependencies".softreq;
local random_bytes = require "util.random".bytes;
local bit = require "util.bitcompat";
local band = bit.band;
local bor = bit.bor;
-local lshift = bit.lshift;
-local rshift = bit.rshift;
local sbit = require "util.strbitop";
local sxor = sbit.sxor;
-local s_char= string.char;
-local s_pack = string.pack;
-local s_unpack = string.unpack;
+local s_char = string.char;
+local s_pack = require"util.struct".pack;
+local s_unpack = require"util.struct".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 = str:byte(pos, pos+1);
- return l1*256 + l2;
-end
--- FIXME: this may lose precision
-local function read_uint64be(str, pos)
- local l1, l2, l3, l4, l5, l6, l7, l8 = str:byte(pos, pos+7);
- local h = lshift(l1, 24) + lshift(l2, 16) + lshift(l3, 8) + l4;
- local l = lshift(l5, 24) + lshift(l6, 16) + lshift(l7, 8) + l8;
- return h * 2^32 + l;
-end
local function pack_uint16be(x)
- return s_char(rshift(x, 8), band(x, 0xFF));
-end
-local function get_byte(x, n)
- return band(rshift(x, n), 0xFF);
+ return s_pack(">I2", x);
end
local function pack_uint64be(x)
- local h = band(x / 2^32, 2^32-1);
- return s_char(get_byte(h, 24), get_byte(h, 16), get_byte(h, 8), band(h, 0xFF),
- get_byte(x, 24), get_byte(x, 16), get_byte(x, 8), band(x, 0xFF));
+ return s_pack(">I8", x);
end
-if s_pack then
- function pack_uint16be(x)
- return s_pack(">I2", x);
- end
- function pack_uint64be(x)
- return s_pack(">I8", x);
+local function read_uint16be(str, pos)
+ if type(str) ~= "string" then
+ str, pos = str:sub(pos, pos+1), 1;
end
+ return s_unpack(">I2", str, pos);
end
-
-if s_unpack then
- function read_uint16be(str, pos)
- if type(str) ~= "string" then
- str, pos = str:sub(pos, pos+1), 1;
- end
- return s_unpack(">I2", str, pos);
- end
- function read_uint64be(str, pos)
- if type(str) ~= "string" then
- str, pos = str:sub(pos, pos+7), 1;
- end
- return s_unpack(">I8", str, pos);
+local function read_uint64be(str, pos)
+ if type(str) ~= "string" then
+ str, pos = str:sub(pos, pos+7), 1;
end
+ return s_unpack(">I8", str, pos);
end
local function parse_frame_header(frame)