mod_tls: Merged duplicate code.
[prosody.git] / plugins / mod_bosh.lua
index 76009bb431f4a59626a062f6ba4b513630f4347c..f25e7670779fe49dbff45cb7d9c3d36fcb2102d5 100644 (file)
@@ -34,6 +34,22 @@ local BOSH_DEFAULT_MAXPAUSE = tonumber(module:get_option("bosh_max_pause")) or 3
 local default_headers = { ["Content-Type"] = "text/xml; charset=utf-8" };
 local session_close_reply = { headers = default_headers, body = st.stanza("body", { xmlns = xmlns_bosh, type = "terminate" }), attr = {} };
 
+local cross_domain = module:get_option("cross_domain_bosh");
+if cross_domain then
+       default_headers["Access-Control-Allow-Methods"] = "GET, POST, OPTIONS";
+       default_headers["Access-Control-Allow-Headers"] = "Content-Type";
+       default_headers["Access-Control-Max-Age"] = "7200";
+
+       if cross_domain == true then
+               default_headers["Access-Control-Allow-Origin"] = "*";
+       elseif type(cross_domain) == "table" then
+               cross_domain = table.concat(cross_domain, ", ");
+       end
+       if type(cross_domain) == "string" then
+               default_headers["Access-Control-Allow-Origin"] = cross_domain;
+       end
+end
+
 local t_insert, t_remove, t_concat = table.insert, table.remove, table.concat;
 local os_time = os.time;
 
@@ -61,7 +77,11 @@ end
 
 function handle_request(method, body, request)
        if (not body) or request.method ~= "POST" then
-               return "<html><body>You really don't look like a BOSH client to me... what do you want?</body></html>";
+               if request.method == "OPTIONS" then
+                       return { headers = default_headers, body = "" };
+               else
+                       return "<html><body>You really don't look like a BOSH client to me... what do you want?</body></html>";
+               end
        end
        if not method then
                log("debug", "Request %s suffered error %s", tostring(request.id), body);