Diff

net/websocket.lua @ 6407:4bbd198cf3e6

net.websocket: Fix handling of 'protocol' argument
author Kim Alvefur <zash@zash.se>
date Thu, 11 Sep 2014 00:55:51 +0200
parent 6398:ad434f47bfc0
child 6455:b6514e691a70
line wrap: on
line diff
--- a/net/websocket.lua	Thu Sep 11 00:31:11 2014 +0200
+++ b/net/websocket.lua	Thu Sep 11 00:55:51 2014 +0200
@@ -190,17 +190,20 @@
 	-- Either a single protocol string or an array of protocol strings.
 	local protocol = ex.protocol;
 	if type(protocol) == "string" then
-		protocol = { protocol };
-	end
-	for _, v in ipairs(protocol) do
-		protocol[v] = true;
+		protocol = { protocol, [protocol] = true };
+	elseif type(protocol) == "table" and protocol[1] then
+		for _, v in ipairs(protocol) do
+			protocol[v] = true;
+		end
+	else
+		protocol = nil;
 	end
 
 	local headers = {
 		["Upgrade"] = "websocket";
 		["Connection"] = "Upgrade";
 		["Sec-WebSocket-Key"] = key;
-		["Sec-WebSocket-Protocol"] = t_concat(protocol, ", ");
+		["Sec-WebSocket-Protocol"] = protocol and t_concat(protocol, ", ");
 		["Sec-WebSocket-Version"] = "13";
 		["Sec-WebSocket-Extensions"] = ex.extensions;
 	}
@@ -238,7 +241,7 @@
 		   or r.headers["connection"]:lower() ~= "upgrade"
 		   or r.headers["upgrade"] ~= "websocket"
 		   or r.headers["sec-websocket-accept"] ~= base64.encode(sha1(key .. "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))
-		   or not protocol[r.headers["sec-websocket-protocol"]]
+		   or (protocol and not protocol[r.headers["sec-websocket-protocol"]])
 		   then
 			s.readyState = 3;
 			log("warn", "WebSocket connection to %s failed: %s", url, tostring(b));