diff options
author | Waqas Hussain <waqas20@gmail.com> | 2011-02-23 02:03:55 +0500 |
---|---|---|
committer | Waqas Hussain <waqas20@gmail.com> | 2011-02-23 02:03:55 +0500 |
commit | fc6149a695b65875580ff0a474af0748fc519d86 (patch) | |
tree | ca3fe6b6a7602145f217bfa0f104cb67a8c08726 | |
parent | b3cc9f42dfe336960903dc0f6a52e3606186543e (diff) | |
download | prosody-fc6149a695b65875580ff0a474af0748fc519d86.tar.gz prosody-fc6149a695b65875580ff0a474af0748fc519d86.zip |
net.httpserver: Catch errors thrown in HTTP handlers.
-rw-r--r-- | net/httpserver.lua | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/net/httpserver.lua b/net/httpserver.lua index 33ced072..6d6408f7 100644 --- a/net/httpserver.lua +++ b/net/httpserver.lua @@ -17,6 +17,8 @@ local listener; local t_insert, t_concat = table.insert, table.concat; local tonumber, tostring, pairs, ipairs, type = tonumber, tostring, pairs, ipairs, type; +local xpcall = xpcall; +local debug_traceback = debug.traceback; local urlencode = function (s) return s and (s:gsub("%W", function (c) return ("%%%02x"):format(c:byte()); end)); end @@ -86,6 +88,12 @@ local function call_callback(request, err) callback = (request.server and request.server.handlers[base]) or default_handler; end if callback then + local _callback = callback; + function callback(a, b, c) + local status, result = xpcall(function() _callback(a, b, c) end, debug_traceback); + if status then return result; end + log("error", "Error in HTTP server handler: %s", result); + end if err then log("debug", "Request error: "..err); if not callback(nil, err, request) then |