Mercurial > prosody-hg
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) |
