net.httpserver: Catch errors thrown in HTTP handlers.
authorWaqas Hussain <waqas20@gmail.com>
Tue, 22 Feb 2011 21:03:55 +0000 (02:03 +0500)
committerWaqas Hussain <waqas20@gmail.com>
Tue, 22 Feb 2011 21:03:55 +0000 (02:03 +0500)
net/httpserver.lua

index 33ced072c4e5d8e399fa8245e9996048df147f4b..6d6408f76437e1e9e2043bd5d90f9c26f9f8906c 100644 (file)
@@ -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