Software /
code /
prosody
Comparison
net/http/server.lua @ 4668:cce0c739b0d7
net.http.server: Support for wildcard events (events that end with '/*')
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Mon, 23 Apr 2012 21:29:18 +0100 |
parent | 4659:d53142e90cd0 |
child | 4682:9d90c70b6358 |
comparison
equal
deleted
inserted
replaced
4667:d0cfc49f3f2b | 4668:cce0c739b0d7 |
---|---|
19 | 19 |
20 local sessions = {}; | 20 local sessions = {}; |
21 local handlers = {}; | 21 local handlers = {}; |
22 | 22 |
23 local listener = {}; | 23 local listener = {}; |
24 | |
25 local function is_wildcard_event(event) | |
26 return event:sub(-2, -1) == "/*"; | |
27 end | |
28 local function is_wildcard_match(wildcard_event, event) | |
29 log("debug", "comparing %q with %q", wildcard_event:sub(1, -2), event:sub(1, #wildcard_event-1)); | |
30 return wildcard_event:sub(1, -2) == event:sub(1, #wildcard_event-1); | |
31 end | |
32 | |
33 local event_map = events._event_map; | |
34 setmetatable(events._handlers, { | |
35 __index = function (handlers, curr_event) | |
36 if is_wildcard_event(curr_event) then return; end -- Wildcard events cannot be fired | |
37 -- Find all handlers that could match this event, sort them | |
38 -- and then put the array into handlers[event] | |
39 local matching_handlers_set = {}; | |
40 local handlers_array = {}; | |
41 for event, handlers_set in pairs(event_map) do | |
42 if event == curr_event or | |
43 is_wildcard_event(event) and is_wildcard_match(event, curr_event) then | |
44 for handler, priority in pairs(handlers_set) do | |
45 matching_handlers_set[handler] = { (select(2, event:gsub("/", "%1"))), priority }; | |
46 table.insert(handlers_array, handler); | |
47 end | |
48 end | |
49 end | |
50 if #handlers_array == 0 then return; end | |
51 table.sort(handlers_array, function(b, a) | |
52 local a_score, b_score = matching_handlers_set[a], matching_handlers_set[b]; | |
53 for i = 1, #a_score do | |
54 if a ~= b then -- If equal, compare next score value | |
55 return a_score[i] < b_score[i]; | |
56 end | |
57 end | |
58 return false; | |
59 end); | |
60 handlers[curr_event] = handlers_array; | |
61 return handlers_array; | |
62 end; | |
63 __newindex = function (handlers, curr_event, handlers_array) | |
64 if handlers_array == nil | |
65 and is_wildcard_event(curr_event) then | |
66 -- Invalidate all matching | |
67 for event in pairs(handlers) do | |
68 if is_wildcard_match(curr_event, event) then | |
69 handlers[event] = nil; | |
70 end | |
71 end | |
72 end | |
73 end; | |
74 }); | |
24 | 75 |
25 local handle_request; | 76 local handle_request; |
26 local _1, _2, _3; | 77 local _1, _2, _3; |
27 local function _handle_request() return handle_request(_1, _2, _3); end | 78 local function _handle_request() return handle_request(_1, _2, _3); end |
28 local function _traceback_handler(err) log("error", "Traceback[http]: %s: %s", tostring(err), debug.traceback()); end | 79 local function _traceback_handler(err) log("error", "Traceback[http]: %s: %s", tostring(err), debug.traceback()); end |