Merge 0.9->0.10
[prosody.git] / net / http / server.lua
index 510b77fbd1fbfeb62ccfc1dd3f9be4d6f5cf124c..aeaa7416065f1bf646d5c13b6ce9d511b2317d84 100644 (file)
@@ -11,6 +11,7 @@ local setmetatable = setmetatable;
 local xpcall = xpcall;
 local traceback = debug.traceback;
 local tostring = tostring;
+local cache = require "util.cache";
 local codes = require "net.http.codes";
 
 local _M = {};
@@ -27,7 +28,10 @@ local function is_wildcard_match(wildcard_event, event)
        return wildcard_event:sub(1, -2) == event:sub(1, #wildcard_event-1);
 end
 
-local recent_wildcard_events, max_cached_wildcard_events = {}, 10000;
+local _handlers = events._handlers;
+local recent_wildcard_events = cache.new(10000, function (key, value)
+       rawset(_handlers, key, nil);
+end);
 
 local event_map = events._event_map;
 setmetatable(events._handlers, {
@@ -62,10 +66,7 @@ setmetatable(events._handlers, {
                end
                rawset(handlers, curr_event, handlers_array);
                if not event_map[curr_event] then -- Only wildcard handlers match, if any
-                       table.insert(recent_wildcard_events, curr_event);
-                       if #recent_wildcard_events > max_cached_wildcard_events then
-                               rawset(handlers, table.remove(recent_wildcard_events, 1), nil);
-                       end
+                       recent_wildcard_events:set(curr_event, true);
                end
                return handlers_array;
        end;
@@ -98,7 +99,7 @@ function listener.onconnect(conn)
        local pending = {};
        local waiting = false;
        local function process_next()
-               if waiting then log("debug", "can't process_next, waiting"); return; end
+               if waiting then return; end -- log("debug", "can't process_next, waiting");
                waiting = true;
                while sessions[conn] and #pending > 0 do
                        local request = t_remove(pending);
@@ -142,6 +143,10 @@ function listener.ondisconnect(conn)
        sessions[conn] = nil;
 end
 
+function listener.ondetach(conn)
+       sessions[conn] = nil;
+end
+
 function listener.onincoming(conn, data)
        sessions[conn]:feed(data);
 end
@@ -214,7 +219,7 @@ function handle_request(conn, request, finish_cb)
 
        local event = request.method.." "..host..request.path:match("[^?]*");
        local payload = { request = request, response = response };
-       --log("debug", "Firing event: %s", event);
+       log("debug", "Firing event: %s", event);
        local result = events.fire_event(event, payload);
        if result ~= nil then
                if result ~= true then
@@ -289,7 +294,7 @@ function _M.remove_handler(event, handler)
 end
 
 function _M.listen_on(port, interface, ssl)
-       addserver(interface or "*", port, listener, "*a", ssl);
+       return addserver(interface or "*", port, listener, "*a", ssl);
 end
 function _M.add_host(host)
        hosts[host] = true;