Mercurial > prosody-hg
comparison net/http/server.lua @ 4726:917a5ffb73f1
net.http.server: Correctly cache results of handler indexing, and also cache failures
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Fri, 27 Apr 2012 20:00:06 +0100 |
| parents | 4d6ebe54671e |
| children | 5ebf4096a2e1 |
comparison
equal
deleted
inserted
replaced
| 4725:d085db6285db | 4726:917a5ffb73f1 |
|---|---|
| 44 matching_handlers_set[handler] = { (select(2, event:gsub("/", "%1"))), is_wildcard_event(event) and 0 or 1, priority }; | 44 matching_handlers_set[handler] = { (select(2, event:gsub("/", "%1"))), is_wildcard_event(event) and 0 or 1, priority }; |
| 45 table.insert(handlers_array, handler); | 45 table.insert(handlers_array, handler); |
| 46 end | 46 end |
| 47 end | 47 end |
| 48 end | 48 end |
| 49 if #handlers_array == 0 then return; end | 49 if #handlers_array > 0 then |
| 50 table.sort(handlers_array, function(b, a) | 50 table.sort(handlers_array, function(b, a) |
| 51 local a_score, b_score = matching_handlers_set[a], matching_handlers_set[b]; | 51 local a_score, b_score = matching_handlers_set[a], matching_handlers_set[b]; |
| 52 for i = 1, #a_score do | 52 for i = 1, #a_score do |
| 53 if a_score[i] ~= b_score[i] then -- If equal, compare next score value | 53 if a_score[i] ~= b_score[i] then -- If equal, compare next score value |
| 54 return a_score[i] < b_score[i]; | 54 return a_score[i] < b_score[i]; |
| 55 end | 55 end |
| 56 end | 56 end |
| 57 return false; | 57 return false; |
| 58 end); | 58 end); |
| 59 handlers[curr_event] = handlers_array; | 59 else |
| 60 handlers_array = false; | |
| 61 end | |
| 62 rawset(handlers, curr_event, handlers_array); | |
| 60 return handlers_array; | 63 return handlers_array; |
| 61 end; | 64 end; |
| 62 __newindex = function (handlers, curr_event, handlers_array) | 65 __newindex = function (handlers, curr_event, handlers_array) |
| 63 if handlers_array == nil | 66 if handlers_array == nil |
| 64 and is_wildcard_event(curr_event) then | 67 and is_wildcard_event(curr_event) then |
| 67 if is_wildcard_match(curr_event, event) then | 70 if is_wildcard_match(curr_event, event) then |
| 68 handlers[event] = nil; | 71 handlers[event] = nil; |
| 69 end | 72 end |
| 70 end | 73 end |
| 71 end | 74 end |
| 75 rawset(handlers, curr_event, handlers_array); | |
| 72 end; | 76 end; |
| 73 }); | 77 }); |
| 74 | 78 |
| 75 local handle_request; | 79 local handle_request; |
| 76 local _1, _2, _3; | 80 local _1, _2, _3; |
