Merge 0.9->0.10
[prosody.git] / net / websocket.lua
index 3c4746b7bcdbb6ee20c5c6b9de22a5167829ab5a..a4274eec9c3111bfe246f7b8333389befd272702 100644 (file)
@@ -134,7 +134,7 @@ function websocket_methods:close(code, reason)
                log("debug", "closing WebSocket with code %i: %s" , code , tostring(reason));
                self.readyState = 2;
                local handler = self.handler;
-               handler:write(frames.build_close(code, reason));
+               handler:write(frames.build_close(code, reason, true));
                -- Do not close socket straight away, wait for acknowledgement from server.
                self.close_timer = timer.add_task(close_timeout, close_timeout_cb, self);
        elseif self.readyState == 2 then
@@ -190,17 +190,20 @@ local function connect(url, ex, listeners)
        -- 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 @@ local function connect(url, ex, listeners)
                   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));