X-Git-Url: https://git.enpas.org/?a=blobdiff_plain;f=net%2Fhttpserver.lua;h=74f61c56a46182b27d654b6b17cfab77a8d6df73;hb=9219b5b35c5be9687eafac1f840246c10352905e;hp=d401f47c6552e8c7f4855eea084433ee31f0b4bb;hpb=207b8b27a5ffc27f663353986cc7ea6af8ff8fc0;p=prosody.git diff --git a/net/httpserver.lua b/net/httpserver.lua index d401f47c..74f61c56 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 @@ -28,10 +30,6 @@ module "httpserver" local default_handler; -local function expectbody(reqt) - return reqt.method == "POST"; -end - local function send_response(request, response) -- Write status line local resp; @@ -86,6 +84,22 @@ 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(method, body, request) + local ok, result = xpcall(function() return _callback(method, body, request) end, debug_traceback); + if ok then return result; end + log("error", "Error in HTTP server handler: %s", result); + -- TODO: When we support pipelining, request.destroyed + -- won't be the right flag - we just want to see if there + -- has been a response to this request yet. + if not request.destroyed then + return { + status = "500 Internal Server Error"; + headers = { ["Content-Type"] = "text/plain" }; + body = "There was an error processing your request. See the error log for more details."; + }; + end + end if err then log("debug", "Request error: "..err); if not callback(nil, err, request) then