X-Git-Url: https://git.archive.openwrt.org/?p=project%2Fluci.git;a=blobdiff_plain;f=modules%2Frpc%2Fluasrc%2Fjsonrpc.lua;h=71c95d549b92d5c9025a6c3ab61df3d7b885aa85;hp=84a7f7056c6525e1c53f71c639d2fbe5be293cec;hb=b0b28b970fe5efede10dff0f1e379fbab5b333ca;hpb=3bcab661283d5b9886e46d6bcdab0e756b044997 diff --git a/modules/rpc/luasrc/jsonrpc.lua b/modules/rpc/luasrc/jsonrpc.lua index 84a7f7056..71c95d549 100644 --- a/modules/rpc/luasrc/jsonrpc.lua +++ b/modules/rpc/luasrc/jsonrpc.lua @@ -23,28 +23,31 @@ function resolve(mod, method) if not type(mod) == "table" then break end - mod = mod[path[j]] + mod = rawget(mod, path[j]) if not mod then break end end - mod = type(mod) == "table" and mod[path[#path]] or nil + mod = type(mod) == "table" and rawget(mod, path[#path]) or nil if type(mod) == "function" then return mod end end -function handle(tbl, rawdata) - local stat, json = luci.util.copcall(luci.json.Decode, rawdata) +function handle(tbl, rawsource, ...) + local decoder = luci.json.Decoder() + local stat = luci.ltn12.pump.all(rawsource, decoder:sink()) + local json = decoder:get() local response local success = false if stat then if type(json.method) == "string" and (not json.params or type(json.params) == "table") then - if tbl[json.method] then + local method = resolve(tbl, json.method) + if method then response = reply(json.jsonrpc, json.id, - proxy(resolve(tbl, json.method), unpack(json.params or {}))) + proxy(method, unpack(json.params or {}))) else response = reply(json.jsonrpc, json.id, nil, {code=-32601, message="Method not found."}) @@ -54,22 +57,22 @@ function handle(tbl, rawdata) nil, {code=-32600, message="Invalid request."}) end else - response = reply(json.jsonrpc, nil, + response = reply("2.0", nil, nil, {code=-32700, message="Parse error."}) end - return luci.json.Encode(response) + return luci.json.Encoder(response, ...):source() end function reply(jsonrpc, id, res, err) require "luci.json" - id = id or luci.json.Null + id = id or luci.json.null -- 1.0 compatibility if jsonrpc ~= "2.0" then jsonrpc = nil - res = res or luci.json.Null - err = err or luci.json.Null + res = res or luci.json.null + err = err or luci.json.null end return {id=id, result=res, error=err, jsonrpc=jsonrpc} @@ -83,9 +86,9 @@ function proxy(method, ...) return nil, {code=-32602, message="Invalid params.", data=table.remove(res, 1)} else if #res <= 1 then - return res[1] or luci.json.Null + return res[1] or luci.json.null else return res end end -end \ No newline at end of file +end