Software /
code /
prosody
Comparison
net/websocket.lua @ 10563:e8db377a2983
Merge 0.11->trunk
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 24 Dec 2019 00:39:45 +0100 |
parent | 10453:926d6086a95a |
child | 12974:ba409c67353b |
comparison
equal
deleted
inserted
replaced
10562:670afc079f68 | 10563:e8db377a2983 |
---|---|
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"]; |