diff net/websocket/frames.lua @ 11166:51e5149ed0ad

Merge 0.11->trunk
author Matthew Wild <mwild1@gmail.com>
date Thu, 15 Oct 2020 14:25:09 +0100
parents 3a72cb126d6c 4e5a2af9dd19
children 2d3080d02960
line wrap: on
line diff
--- a/net/websocket/frames.lua	Thu Oct 15 13:43:03 2020 +0100
+++ b/net/websocket/frames.lua	Thu Oct 15 14:25:09 2020 +0100
@@ -12,12 +12,11 @@
 local bit = require "util.bitcompat";
 local band = bit.band;
 local bor = bit.bor;
-local bxor = bit.bxor;
 local lshift = bit.lshift;
 local rshift = bit.rshift;
-local unpack = table.unpack or unpack; -- luacheck: ignore 113
+local sbit = require "util.strbitop";
+local sxor = sbit.sxor;
 
-local t_concat = table.concat;
 local s_char= string.char;
 local s_pack = string.pack;
 local s_unpack = string.unpack;
@@ -106,7 +105,7 @@
 	end
 
 	if result.MASK then
-		result.key = { frame:byte(length_bytes+3, length_bytes+6) };
+		result.key = frame:sub(length_bytes+3, length_bytes+6);
 	end
 
 	return result, header_length;
@@ -115,19 +114,7 @@
 -- XORs the string `str` with the array of bytes `key`
 -- TODO: optimize
 local function apply_mask(str, key, from, to)
-	from = from or 1
-	if from < 0 then from = #str + from + 1 end -- negative indices
-	to = to or #str
-	if to < 0 then to = #str + to + 1 end -- negative indices
-	local key_len = #key
-	local counter = 0;
-	local data = {};
-	for i = from, to do
-		local key_index = counter%key_len + 1;
-		counter = counter + 1;
-		data[counter] = s_char(bxor(key[key_index], str:byte(i)));
-	end
-	return t_concat(data);
+	return sxor(str:sub(from or 1, to or -1), key);
 end
 
 local function parse_frame_body(frame, header, pos)
@@ -174,15 +161,12 @@
 
 	local key = ""
 	if desc.MASK then
-		local key_a = desc.key
-		if key_a then
-			key = s_char(unpack(key_a, 1, 4));
-		else
+		key = desc.key
+		if not key then
 			key = random_bytes(4);
-			key_a = {key:byte(1,4)};
 		end
 		b2 = bor(b2, 0x80);
-		data = apply_mask(data, key_a);
+		data = apply_mask(data, key);
 	end
 
 	return s_char(b1, b2) .. length_extra .. key .. data