Completed first version of JSON-RPC API
authorSteven Barth <steven@midlink.org>
Fri, 29 Aug 2008 12:27:54 +0000 (12:27 +0000)
committerSteven Barth <steven@midlink.org>
Fri, 29 Aug 2008 12:27:54 +0000 (12:27 +0000)
modules/rpc/luasrc/controller/rpc.lua
modules/rpc/luasrc/jsonrpc.lua

index 98fafe3f1bb6c6eda2f9b9799e39281c3601ea8d..0fcd263f5dad3767cf20c072170957bf5295b235 100644 (file)
@@ -16,6 +16,8 @@ $Id$
 local require = require
 local pairs = pairs
 local print = print
+local pcall = pcall
+local table = table
 
 module "luci.controller.rpc"
 
@@ -86,30 +88,42 @@ end
 
 function rpc_fs()
        local util    = require "luci.util"
-       local fs      = util.clone(require "luci.fs")
+       local io      = require "io"
+       local fs2     = util.clone(require "luci.fs")
        local jsonrpc = require "luci.jsonrpc"
        local http    = require "luci.http"
        local ltn12   = require "luci.ltn12"
-       
-       function fs.readfile(filename)
-               if not pcall(require, "mime") then
+
+       function fs2.readfile(filename)
+               local stat, mime = pcall(require, "mime")
+               if not stat then
                        error("Base64 support not available. Please install LuaSocket.")
                end
-               
-               return ltn12.source.chain(ltn12.source.file(filename), mime.encode("base64"))
+
+               local fp = io.open(filename)
+               if not fp then
+                       return nil
+               end
+
+               local output = {}
+               local sink = ltn12.sink.table(output)
+               local source = ltn12.source.chain(ltn12.source.file(fp), mime.encode("base64"))
+               return ltn12.pump.all(source, sink) and table.concat(output)
        end
        
-       function fs.writefile(filename, data)
-               if not pcall(require, "mime") then
+       function fs2.writefile(filename, data)
+               local stat, mime = pcall(require, "mime")
+               if not stat then
                        error("Base64 support not available. Please install LuaSocket.")
                end
-       
-               local sink = ltn12.sink.chain(mime.decode("base64"), ltn12.sink.file(filename))
-               return ltn12.pump.all(ltn12.source.string(data), sink)
+
+               local  file = io.open(filename, "w")
+               local  sink = file and ltn12.sink.chain(mime.decode("base64"), ltn12.sink.file(file))
+               return sink and ltn12.pump.all(ltn12.source.string(data), sink) or false
        end
        
        http.prepare_content("application/json")
-       ltn12.pump.all(jsonrpc.handle(fs, http.source()), http.write)
+       ltn12.pump.all(jsonrpc.handle(fs2, http.source()), http.write)
 end
 
 function rpc_sys()
@@ -120,4 +134,4 @@ function rpc_sys()
        
        http.prepare_content("application/json")
        ltn12.pump.all(jsonrpc.handle(sys, http.source()), http.write)
-end
\ No newline at end of file
+end
index 1c0db8bcefbb622254e755658f5591525de4fbdc..71c95d549b92d5c9025a6c3ab61df3d7b885aa85 100644 (file)
@@ -44,9 +44,10 @@ function handle(tbl, rawsource, ...)
        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."})
@@ -90,4 +91,4 @@ function proxy(method, ...)
                        return res
                end
        end
-end
\ No newline at end of file
+end