Mercurial > prosody-hg
comparison net/websocket.lua @ 11200:bf8f2da84007
Merge 0.11->trunk
| author | Kim Alvefur <zash@zash.se> |
|---|---|
| date | Thu, 05 Nov 2020 22:31:25 +0100 |
| parents | 926d6086a95a |
| children | ba409c67353b |
comparison
equal
deleted
inserted
replaced
| 11199:6c7c50a4de32 | 11200:bf8f2da84007 |
|---|---|
| 21 local websockets = {}; | 21 local websockets = {}; |
| 22 | 22 |
| 23 local websocket_listeners = {}; | 23 local websocket_listeners = {}; |
| 24 function websocket_listeners.ondisconnect(conn, err) | 24 function websocket_listeners.ondisconnect(conn, err) |
| 25 local s = websockets[conn]; | 25 local s = websockets[conn]; |
| 26 if not s then return; end | |
| 26 websockets[conn] = nil; | 27 websockets[conn] = nil; |
| 27 if s.close_timer then | 28 if s.close_timer then |
| 28 timer.stop(s.close_timer); | 29 timer.stop(s.close_timer); |
| 29 s.close_timer = nil; | 30 s.close_timer = nil; |
| 30 end | 31 end |
| 111 elseif frame.opcode == 0x9 then -- Ping frame | 112 elseif frame.opcode == 0x9 then -- Ping frame |
| 112 frame.opcode = 0xA; | 113 frame.opcode = 0xA; |
| 113 frame.MASK = true; -- RFC 6455 6.1.5: If the data is being sent by the client, the frame(s) MUST be masked | 114 frame.MASK = true; -- RFC 6455 6.1.5: If the data is being sent by the client, the frame(s) MUST be masked |
| 114 conn:write(frames.build(frame)); | 115 conn:write(frames.build(frame)); |
| 115 elseif frame.opcode == 0xA then -- Pong frame | 116 elseif frame.opcode == 0xA then -- Pong frame |
| 116 log("debug", "Received unexpected pong frame: " .. tostring(frame.data)); | 117 log("debug", "Received unexpected pong frame: %s", frame.data); |
| 117 else | 118 else |
| 118 return fail(s, 1002, "Reserved opcode"); | 119 return fail(s, 1002, "Reserved opcode"); |
| 119 end | 120 end |
| 120 end | 121 end |
| 121 end | 122 end |
| 129 s.conn:close(); | 130 s.conn:close(); |
| 130 end | 131 end |
| 131 function websocket_methods:close(code, reason) | 132 function websocket_methods:close(code, reason) |
| 132 if self.readyState < 2 then | 133 if self.readyState < 2 then |
| 133 code = code or 1000; | 134 code = code or 1000; |
| 134 log("debug", "closing WebSocket with code %i: %s" , code , tostring(reason)); | 135 log("debug", "closing WebSocket with code %i: %s" , code , reason); |
| 135 self.readyState = 2; | 136 self.readyState = 2; |
| 136 local conn = self.conn; | 137 local conn = self.conn; |
| 137 conn:write(frames.build_close(code, reason, true)); | 138 conn:write(frames.build_close(code, reason, true)); |
| 138 -- Do not close socket straight away, wait for acknowledgement from server. | 139 -- Do not close socket straight away, wait for acknowledgement from server. |
| 139 self.close_timer = timer.add_task(close_timeout, close_timeout_cb, self); | 140 self.close_timer = timer.add_task(close_timeout, close_timeout_cb, self); |
| 243 or r.headers["upgrade"] ~= "websocket" | 244 or r.headers["upgrade"] ~= "websocket" |
| 244 or r.headers["sec-websocket-accept"] ~= base64.encode(sha1(key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")) | 245 or r.headers["sec-websocket-accept"] ~= base64.encode(sha1(key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11")) |
| 245 or (protocol and not protocol[r.headers["sec-websocket-protocol"]]) | 246 or (protocol and not protocol[r.headers["sec-websocket-protocol"]]) |
| 246 then | 247 then |
| 247 s.readyState = 3; | 248 s.readyState = 3; |
| 248 log("warn", "WebSocket connection to %s failed: %s", url, tostring(b)); | 249 log("warn", "WebSocket connection to %s failed: %s", url, b); |
| 249 if s.onerror then s:onerror("connecting-failed"); end | 250 if s.onerror then s:onerror("connecting-failed"); end |
| 250 return; | 251 return; |
| 251 end | 252 end |
| 252 | 253 |
| 253 s.protocol = r.headers["sec-websocket-protocol"]; | 254 s.protocol = r.headers["sec-websocket-protocol"]; |
