svn commit: samba r19051 - in branches/SAMBA_4_0: jsonrpc source/scripting/ejs source/web_server

derrell at samba.org derrell at samba.org
Mon Oct 2 20:39:32 GMT 2006


Author: derrell
Date: 2006-10-02 20:39:31 +0000 (Mon, 02 Oct 2006)
New Revision: 19051

WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=19051

Log:
JSON-RPC server work-in-progress.  It's almost working.
Modified:
   branches/SAMBA_4_0/jsonrpc/json.esp
   branches/SAMBA_4_0/jsonrpc/jsondate.esp
   branches/SAMBA_4_0/jsonrpc/request.esp
   branches/SAMBA_4_0/source/scripting/ejs/smbcalls.c
   branches/SAMBA_4_0/source/scripting/ejs/smbcalls_sys.c
   branches/SAMBA_4_0/source/web_server/http.c


Changeset:
Modified: branches/SAMBA_4_0/jsonrpc/json.esp
===================================================================
--- branches/SAMBA_4_0/jsonrpc/json.esp	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/jsonrpc/json.esp	2006-10-02 20:39:31 UTC (rev 19051)
@@ -37,6 +37,11 @@
         }
     }
 
+    if (arr.length == 0)
+    {
+        return "";
+    }
+    
     return join("", arr);
 }
 
@@ -72,11 +77,15 @@
     }
     else if (type == "float" ||
              type == "integer" ||
-             type == "integer64" ||
-             type == "pointer")
+             type == "integer64")
     {
-        return (o + 0);
+        return o + 0;
     }
+    else if (type == "pointer")
+    {
+        var x = "" + o;
+        return '"' + substr(x, 16, strlen(x) - 16 - 1) + '"';
+    }
     else if (type == "object")
     {
         var buf;
@@ -128,6 +137,10 @@
     {
         return '"' + this._internal.escape(o) + '"';
     }
+    else
+    {
+        return '{ "unknown_object":"' + type + '"}';
+    }
 }
 
 /* Allocate the public Json access object */
@@ -193,6 +206,7 @@
 
 
 /* Test it */
+/*
 libinclude("base.js");
 function testFormat()
 {
@@ -211,7 +225,11 @@
     test.obj.array[1] = 223;
     printf("%s\n", Json.encode(test));
 }
+testFormat();
+*/
 
+/*
+libinclude("base.js");
 function testParse()
 {
     var s;
@@ -236,8 +254,6 @@
     obj = Json.decode(s);
     printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
 }
-
-//testFormat();
 testParse();
-
+*/
 %>

Modified: branches/SAMBA_4_0/jsonrpc/jsondate.esp
===================================================================
--- branches/SAMBA_4_0/jsonrpc/jsondate.esp	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/jsonrpc/jsondate.esp	2006-10-02 20:39:31 UTC (rev 19051)
@@ -78,7 +78,7 @@
 
         if (typeof(secondsSinceEpoch) != "number")
         {
-            var currentTime = getTimeOfDay();
+            var currentTime = gettimeofday();
             secondsSinceEpoch = currentTime.sec;
             microseconds = currentTime.usec;
         }
@@ -105,7 +105,7 @@
     {
         return this.month;
     }
-    o.getUtcMonth = getUtcMonth;
+    o.getUtcMonth = _getUtcMonth;
 
     function _getUtcDay()
     {
@@ -167,7 +167,7 @@
 
     if (! secondsSinceEpoch)
     {
-        var now = getTimeOfDay();
+        var now = gettimeofday();
         o.setEpochTime(now.sec);
     }
     else

Modified: branches/SAMBA_4_0/jsonrpc/request.esp
===================================================================
--- branches/SAMBA_4_0/jsonrpc/request.esp	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/jsonrpc/request.esp	2006-10-02 20:39:31 UTC (rev 19051)
@@ -14,6 +14,7 @@
  */
 
 /* Bring in the date class */
+jsonrpc_include("json.esp");
 jsonrpc_include("jsondate.esp");
 
 /* bring the string functions into the global frame */
@@ -28,12 +29,6 @@
 }
 
 
-/* KLUDGE... */
-form = new Array();
-server = new Array();
-request = new Array();
-/* ...KLUDGE */
-
 /*
  * All of our manipulation of JSON RPC methods will be through this object.
  * Each class of methods will assign to here, and all of the constants will
@@ -147,7 +142,7 @@
     if (scriptTransportId == jsonrpc.Constant.ScriptTransport.NotInUse)
     {
         /* ... then just output the reply. */
-        printf(reply);
+        write(reply);
     }
     else
     {
@@ -156,43 +151,11 @@
             "qx.io.remote.ScriptTransport._requestFinished(" +
             scriptTransportId + ", " + reply +
             ");";
-        printf(reply);
+        write(reply);
     }
 }
 
 
-/*
- * class Json
- *
- * This class provides the JSON encoder and decoder, and some utility
- * functions.
- */
-Json = new Object();
-
-/* KLUDGE... */
-function _jsonDecode(s)
-{
-    var o = new Object();
-    o.id = 23;
-    o.service = "qooxdoo.test";
-    o.method = "echo";
-    o.params = new Array(1);
-    o.params[0] = "hello world";
-    return o;
-}
-/* ...KLUDGE */
-
-Json.decode = _jsonDecode;
-
-/* KLUDGE... */
-function _jsonEncode(o)
-{
-    return "{ result: \"hello world\" }"
-}
-/* ...KLUDGE */
-
-Json.encode = _jsonEncode;
-
 function _jsonValidRequest(req)
 {
     if (req == undefined)
@@ -300,14 +263,14 @@
 scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse;
 
 /* What type of request did we receive? */
-if (server["REQUEST_METHOD"] == "POST" &&
-    server["CONENT_TYPE"] == "text/json")
+if (request["REQUEST_METHOD"] == "POST" &&
+    request["CONTENT_TYPE"] == "text/json")
 {
     /* We found literal POSTed json-rpc data (we hope) */
     input = request["POST_DATA"];
     jsonInput = Json.decode(input);
 }
-else if (server["REQUEST_METHOD"] == "GET" &&
+else if (request["REQUEST_METHOD"] == "GET" &&
          form["_ScriptTransport_id"] != undefined &&
          form["_ScriptTransport_data"] != undefined)
 {
@@ -318,10 +281,6 @@
     jsonInput = Json.decode(input);
 }
 
-/* KLUDGE... */
-jsonInput = Json.decode(input);
-/* ...KLUDGE */
-
 /* Ensure that this was a JSON-RPC service request */
 if (! jsonrpc.validRequest(jsonInput))
 {
@@ -329,7 +288,7 @@
      * This request was not issued with JSON-RPC so echo the error rather than
      * issuing a JsonRpcError response.
      */
-    printf("JSON-RPC request expected; service, method or params missing<br>");
+    write("JSON-RPC request expected; service, method or params missing<br>");
     return;
 }
 

Modified: branches/SAMBA_4_0/source/scripting/ejs/smbcalls.c
===================================================================
--- branches/SAMBA_4_0/source/scripting/ejs/smbcalls.c	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/source/scripting/ejs/smbcalls.c	2006-10-02 20:39:31 UTC (rev 19051)
@@ -203,7 +203,39 @@
 }
 
 
+static int ejs_debug(int eid, int argc, char **argv)
+{
+        int i;
+        int level;
+        void *ctx = mprMemCtx();
+        char *msg;
 
+
+        if (argc < 2) {
+		return -1;
+        }
+
+        level = atoi(argv[0]);
+
+        msg = talloc_zero_size(ctx, 1);
+        if (msg == NULL) {
+                DEBUG(0, ("out of memory in debug()\n"));
+                return 0;
+        }
+
+        for (i = 1; i < argc; i++) {
+                msg = talloc_append_string(ctx, msg, argv[i]);
+                if (msg == NULL) {
+                        DEBUG(0, ("out of memory in debug()\n"));
+                        return 0;
+                }
+        }
+
+        DEBUG(level, ("%s", msg));
+        talloc_free(msg);
+	return 0;
+}
+
 static void (*ejs_exception_handler) (const char *) = NULL;
 
 _PUBLIC_ void ejs_exception(const char *reason)
@@ -241,5 +273,6 @@
 	ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
 	ejsDefineCFunction(-1, "version", ejs_version, NULL, MPR_VAR_SCRIPT_HANDLE);
 	ejsDefineStringCFunction(-1, "jsonrpc_include", jsonrpc_include, NULL, MPR_VAR_SCRIPT_HANDLE);
+	ejsDefineStringCFunction(-1, "debug", ejs_debug, NULL, MPR_VAR_SCRIPT_HANDLE);
 }
 

Modified: branches/SAMBA_4_0/source/scripting/ejs/smbcalls_sys.c
===================================================================
--- branches/SAMBA_4_0/source/scripting/ejs/smbcalls_sys.c	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/source/scripting/ejs/smbcalls_sys.c	2006-10-02 20:39:31 UTC (rev 19051)
@@ -413,7 +413,7 @@
 	mprSetCFunction(obj, "interfaces", ejs_sys_interfaces);
 	mprSetCFunction(obj, "hostname", ejs_sys_hostname);
 	mprSetCFunction(obj, "nttime", ejs_sys_nttime);
-	mprSetCFunction(obj, "getTimeOfDay", ejs_sys_gettimeofday);
+	mprSetCFunction(obj, "gettimeofday", ejs_sys_gettimeofday);
 	mprSetCFunction(obj, "unix2nttime", ejs_sys_unix2nttime);
 	mprSetCFunction(obj, "gmmktime", ejs_sys_gmmktime);
 	mprSetCFunction(obj, "gmtime", ejs_sys_gmtime);

Modified: branches/SAMBA_4_0/source/web_server/http.c
===================================================================
--- branches/SAMBA_4_0/source/web_server/http.c	2006-10-02 17:26:06 UTC (rev 19050)
+++ branches/SAMBA_4_0/source/web_server/http.c	2006-10-02 20:39:31 UTC (rev 19051)
@@ -36,6 +36,7 @@
 #define SWAT_SESSION_KEY "SwatSessionId"
 #define HTTP_PREAUTH_URI "/scripting/preauth.esp"
 #define JSONRPC_REQUEST "/services"
+#define JSONRPC_SERVER "/services/request.esp"
 
 /* state of the esp subsystem for a specific request */
 struct esp_state {
@@ -415,9 +416,10 @@
 	SETVAR(ESP_REQUEST_OBJ, "CONTENT_LENGTH", 
 	       talloc_asprintf(esp, "%u", web->input.content_length));
 	SETVAR(ESP_REQUEST_OBJ, "QUERY_STRING", web->input.query_string);
-#if 0 /* djl -- not yet.  need to track down the compiler warning */
-	SETVAR(ESP_REQUEST_OBJ, "POST_DATA", web->input.partial);
-#endif
+	SETVAR(ESP_REQUEST_OBJ, "POST_DATA",
+               talloc_strndup(esp,
+                              web->input.partial.data,
+                              web->input.partial.length));
 	SETVAR(ESP_REQUEST_OBJ, "REQUEST_METHOD", web->input.post_request?"POST":"GET");
 	SETVAR(ESP_REQUEST_OBJ, "REQUEST_URI", web->input.url);
 	p = strrchr(web->input.url, '/');
@@ -427,7 +429,6 @@
 		struct MprVar mpv = mprObject("socket_address");
 		mprSetPtrChild(&mpv, "socket_address", peer_address);
 		espSetVar(req, ESP_REQUEST_OBJ, "REMOTE_SOCKET_ADDRESS", mpv);
-
 		SETVAR(ESP_REQUEST_OBJ, "REMOTE_ADDR", peer_address->addr);
 	}
 	p = socket_get_peer_name(web->conn->socket, esp);
@@ -523,6 +524,30 @@
 }
 
 /*
+  process a JSON RPC request
+*/
+static void jsonrpc_request(struct esp_state *esp)
+{
+	const char *path = http_local_path(esp->web, JSONRPC_SERVER);
+
+        /* Ensure we got a valid path. */
+	if (path == NULL) {
+                /* should never occur */
+		http_error(esp->web, 500, "Internal server error");
+		return;
+	}
+
+        /* Ensure that the JSON-RPC server request script exists */
+	if (!file_exist(path)) {
+		http_error_unix(esp->web, path);
+		return;
+	}
+
+        /* Call the server request script */
+	esp_request(esp, JSONRPC_SERVER);
+}
+
+/*
   perform pre-authentication on every page is /scripting/preauth.esp
   exists.  If this script generates any non-whitepace output at all,
   then we don't run the requested URL.
@@ -859,7 +884,11 @@
          * Work out the mime type.  First, we see if the request is a JSON-RPC
          * service request.  If not, we look at the extension.
          */
-        if (strcmp(web->input.url, JSONRPC_REQUEST) == 0) {
+        if (strncmp(web->input.url,
+                    JSONRPC_REQUEST,
+                    sizeof(JSONRPC_REQUEST) - 1) == 0 &&
+            (web->input.url[sizeof(JSONRPC_REQUEST) - 1] == '\0' ||
+             web->input.url[sizeof(JSONRPC_REQUEST) - 1] == '/')) {
             page_type = page_type_jsonrpc;
             file_type = "text/json";
             
@@ -876,6 +905,7 @@
             }
             if (file_type == NULL) {
 		file_type = "text/html";
+                page_type = page_type_simple;
             }
         }
 
@@ -908,11 +938,7 @@
                 break;
 
         case page_type_jsonrpc:
-#if 0 /* djl -- not yet */
-                if (! jsonrpc_request(esp)) {
-                        http_error(web, 500, "Out of memory");
-                }
-#endif
+                jsonrpc_request(esp);
                 break;
         }
 



More information about the samba-cvs mailing list