luci-lua-runtime: proxy all dispatcher context property accesses
authorJo-Philipp Wich <jo@mein.io>
Tue, 15 Nov 2022 18:49:05 +0000 (19:49 +0100)
committerJo-Philipp Wich <jo@mein.io>
Tue, 15 Nov 2022 18:49:05 +0000 (19:49 +0100)
The ucode side dispatcher environment might not be fully populated yet
when the emulated Lua dispatcher is loaded, leading to `context.requested`
and some other properties to be `nil`.

Expose all properties through metatable `__index` lookups instead to
ensure that the Lua side dispatcher always sees the latest values.

Fixes: #6100
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
modules/luci-lua-runtime/luasrc/dispatcher.lua

index 5c349114c456637be501e7b9a3e7b7aef82b60bb..f97e84a69b820aa4479990e5ce9ea89c45bd6086 100644 (file)
@@ -6,16 +6,14 @@ module("luci.dispatcher", package.seeall)
 
 local http = _G.L.http
 
-context = setmetatable({
-       request = _G.L.ctx.request_path;
-       requested = _G.L.node;
-       dispatched = _G.L.node;
-}, {
+context = setmetatable({}, {
        __index = function(t, k)
-               if k == "requestpath" then
+               if k == "request" or k == "requestpath" then
                        return _G.L.ctx.request_path
                elseif k == "requestargs" then
                        return _G.L.ctx.request_args
+               elseif k == "requested" or k == "dispatched" then
+                       return _G.L.node
                else
                        return _G.L.ctx[k]
                end