comparison net/websocket/frames.lua @ 11157:413bd21ba449 0.11

net.websocket.frames: Read buffer length correctly in Lua 5.1 (fix #1598) COMPAT: The __len metamethod does not work with tables in Lua 5.1. Both strings and util.dbuffer now expose their length as a :len() method.
author Kim Alvefur <zash@zash.se>
date Mon, 12 Oct 2020 20:21:18 +0200
parents bcc701377fe4
children 3a72cb126d6c 4e5a2af9dd19
comparison
equal deleted inserted replaced
11156:a8ef69f7fc35 11157:413bd21ba449
74 return s_unpack(">I8", str, pos); 74 return s_unpack(">I8", str, pos);
75 end 75 end
76 end 76 end
77 77
78 local function parse_frame_header(frame) 78 local function parse_frame_header(frame)
79 if #frame < 2 then return; end 79 if frame:len() < 2 then return; end
80 80
81 local byte1, byte2 = frame:byte(1, 2); 81 local byte1, byte2 = frame:byte(1, 2);
82 local result = { 82 local result = {
83 FIN = band(byte1, 0x80) > 0; 83 FIN = band(byte1, 0x80) > 0;
84 RSV1 = band(byte1, 0x40) > 0; 84 RSV1 = band(byte1, 0x40) > 0;
96 elseif result.length == 127 then 96 elseif result.length == 127 then
97 length_bytes = 8; 97 length_bytes = 8;
98 end 98 end
99 99
100 local header_length = 2 + length_bytes + (result.MASK and 4 or 0); 100 local header_length = 2 + length_bytes + (result.MASK and 4 or 0);
101 if #frame < header_length then return; end 101 if frame:len() < header_length then return; end
102 102
103 if length_bytes == 2 then 103 if length_bytes == 2 then
104 result.length = read_uint16be(frame, 3); 104 result.length = read_uint16be(frame, 3);
105 elseif length_bytes == 8 then 105 elseif length_bytes == 8 then
106 result.length = read_uint64be(frame, 3); 106 result.length = read_uint64be(frame, 3);
139 end 139 end
140 end 140 end
141 141
142 local function parse_frame(frame) 142 local function parse_frame(frame)
143 local result, pos = parse_frame_header(frame); 143 local result, pos = parse_frame_header(frame);
144 if result == nil or #frame < (pos + result.length) then return nil, nil, result; end 144 if result == nil or frame:len() < (pos + result.length) then return nil, nil, result; end
145 result.data = parse_frame_body(frame, result, pos+1); 145 result.data = parse_frame_body(frame, result, pos+1);
146 return result, pos + result.length; 146 return result, pos + result.length;
147 end 147 end
148 148
149 local function build_frame(desc) 149 local function build_frame(desc)