Enable stack tracebacks for 500 errors
[project/luci.git] / libs / web / luasrc / dispatcher.lua
index 5f450eb..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
@@ -105,17 +108,15 @@ end
 function httpdispatch(request)
        luci.http.context.request = request
        context.request = {}
-       local pathinfo = request:getenv("PATH_INFO") or ""
+       local pathinfo = http.urldecode(request:getenv("PATH_INFO") or "", true)
 
        for node in pathinfo:gmatch("[^/]+") do
                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()
 
@@ -130,7 +131,19 @@ function dispatch(request)
        ctx.path = request
        ctx.urltoken   = ctx.urltoken or {}
 
-       require "luci.i18n".setlanguage(require "luci.config".main.lang)
+       local conf = require "luci.config"
+       local lang = conf.main.lang
+       if lang == "auto" then
+               local aclang = http.getenv("HTTP_ACCEPT_LANGUAGE") or ""
+               for lpat in aclang:gmatch("[%w-]+") do
+                       lpat = lpat and lpat:gsub("-", "_")
+                       if conf.languages[lpat] then
+                               lang = lpat
+                               break
+                       end
+               end
+        end
+       require "luci.i18n".setlanguage(lang)
 
        local c = ctx.tree
        local stat
@@ -577,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](...)