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"];