Enable stack tracebacks for 500 errors
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index 5110209..6914ffb 100644 (file)
@@ -66,6 +66,7 @@ function error404(message)
        if not luci.util.copcall(luci.template.render, "error404") then
                luci.http.prepare_content("text/plain")
                luci.http.write(message)
+               luci.util.perror(message)
        end
        return false
 end
@@ -74,12 +75,14 @@ end
 -- @param message      Custom error message (optional)#
 -- @return                     false
 function error500(message)
-       luci.http.status(500, "Internal Server Error")
-
-       require("luci.template")
-       if not luci.util.copcall(luci.template.render, "error500", {message=message}) then
-               luci.http.prepare_content("text/plain")
-               luci.http.write(message)
+       if not context.template_header_sent then
+               luci.http.status(500, "Internal Server Error")
+       else
+               require("luci.template")
+               if not luci.util.copcall(luci.template.render, "error500", {message=message}) then
+                       luci.http.prepare_content("text/plain")
+                       luci.http.write(message)
+               end
        end
        return false
 end
@@ -111,11 +114,9 @@ function httpdispatch(request)
                table.insert(context.request, node)
        end
 
-       local stat, err = util.copcall(dispatch, context.request)
-       if not stat then
-               luci.util.perror(err)
-               error500(err)
-       end
+       local stat, err = util.coxpcall(function()
+               dispatch(context.request)
+       end, error500)
 
        luci.http.close()
 
@@ -589,7 +590,7 @@ end
 
 
 local function _call(self, ...)
-       if #self.argv > 0 then 
+       if #self.argv > 0 then
                return getfenv()[self.name](unpack(self.argv), ...)
        else
                return getfenv()[self.name](...)