mirror of
https://github.com/samba-team/samba.git
synced 2025-01-15 23:24:37 +03:00
r19051: JSON-RPC server work-in-progress. It's almost working.
This commit is contained in:
parent
c96dae478c
commit
6e9cb2ed1c
@ -37,6 +37,11 @@ function _escape(s)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (arr.length == 0)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
return join("", arr);
|
return join("", arr);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,10 +77,14 @@ function _encode(o)
|
|||||||
}
|
}
|
||||||
else if (type == "float" ||
|
else if (type == "float" ||
|
||||||
type == "integer" ||
|
type == "integer" ||
|
||||||
type == "integer64" ||
|
type == "integer64")
|
||||||
type == "pointer")
|
|
||||||
{
|
{
|
||||||
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")
|
else if (type == "object")
|
||||||
{
|
{
|
||||||
@ -128,6 +137,10 @@ function _encode(o)
|
|||||||
{
|
{
|
||||||
return '"' + this._internal.escape(o) + '"';
|
return '"' + this._internal.escape(o) + '"';
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return '{ "unknown_object":"' + type + '"}';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allocate the public Json access object */
|
/* Allocate the public Json access object */
|
||||||
@ -193,6 +206,7 @@ Json._internal.convert['\x1f'] = '\\u001f';
|
|||||||
|
|
||||||
|
|
||||||
/* Test it */
|
/* Test it */
|
||||||
|
/*
|
||||||
libinclude("base.js");
|
libinclude("base.js");
|
||||||
function testFormat()
|
function testFormat()
|
||||||
{
|
{
|
||||||
@ -211,7 +225,11 @@ function testFormat()
|
|||||||
test.obj.array[1] = 223;
|
test.obj.array[1] = 223;
|
||||||
printf("%s\n", Json.encode(test));
|
printf("%s\n", Json.encode(test));
|
||||||
}
|
}
|
||||||
|
testFormat();
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
libinclude("base.js");
|
||||||
function testParse()
|
function testParse()
|
||||||
{
|
{
|
||||||
var s;
|
var s;
|
||||||
@ -236,8 +254,6 @@ function testParse()
|
|||||||
obj = Json.decode(s);
|
obj = Json.decode(s);
|
||||||
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
|
printf("Decode/encode of\n\t%s\nyielded\n\t%s\n\n", s, Json.encode(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
//testFormat();
|
|
||||||
testParse();
|
testParse();
|
||||||
|
*/
|
||||||
%>
|
%>
|
||||||
|
@ -78,7 +78,7 @@ function _JSON_Date_create(secondsSinceEpoch)
|
|||||||
|
|
||||||
if (typeof(secondsSinceEpoch) != "number")
|
if (typeof(secondsSinceEpoch) != "number")
|
||||||
{
|
{
|
||||||
var currentTime = getTimeOfDay();
|
var currentTime = gettimeofday();
|
||||||
secondsSinceEpoch = currentTime.sec;
|
secondsSinceEpoch = currentTime.sec;
|
||||||
microseconds = currentTime.usec;
|
microseconds = currentTime.usec;
|
||||||
}
|
}
|
||||||
@ -105,7 +105,7 @@ function _JSON_Date_create(secondsSinceEpoch)
|
|||||||
{
|
{
|
||||||
return this.month;
|
return this.month;
|
||||||
}
|
}
|
||||||
o.getUtcMonth = getUtcMonth;
|
o.getUtcMonth = _getUtcMonth;
|
||||||
|
|
||||||
function _getUtcDay()
|
function _getUtcDay()
|
||||||
{
|
{
|
||||||
@ -167,7 +167,7 @@ function _JSON_Date_create(secondsSinceEpoch)
|
|||||||
|
|
||||||
if (! secondsSinceEpoch)
|
if (! secondsSinceEpoch)
|
||||||
{
|
{
|
||||||
var now = getTimeOfDay();
|
var now = gettimeofday();
|
||||||
o.setEpochTime(now.sec);
|
o.setEpochTime(now.sec);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* Bring in the date class */
|
/* Bring in the date class */
|
||||||
|
jsonrpc_include("json.esp");
|
||||||
jsonrpc_include("jsondate.esp");
|
jsonrpc_include("jsondate.esp");
|
||||||
|
|
||||||
/* bring the string functions into the global frame */
|
/* bring the string functions into the global frame */
|
||||||
@ -28,12 +29,6 @@ function printf()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* KLUDGE... */
|
|
||||||
form = new Array();
|
|
||||||
server = new Array();
|
|
||||||
request = new Array();
|
|
||||||
/* ...KLUDGE */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* All of our manipulation of JSON RPC methods will be through this object.
|
* 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
|
* Each class of methods will assign to here, and all of the constants will
|
||||||
@ -147,7 +142,7 @@ function sendReply(reply, scriptTransportId)
|
|||||||
if (scriptTransportId == jsonrpc.Constant.ScriptTransport.NotInUse)
|
if (scriptTransportId == jsonrpc.Constant.ScriptTransport.NotInUse)
|
||||||
{
|
{
|
||||||
/* ... then just output the reply. */
|
/* ... then just output the reply. */
|
||||||
printf(reply);
|
write(reply);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -156,43 +151,11 @@ function sendReply(reply, scriptTransportId)
|
|||||||
"qx.io.remote.ScriptTransport._requestFinished(" +
|
"qx.io.remote.ScriptTransport._requestFinished(" +
|
||||||
scriptTransportId + ", " + reply +
|
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)
|
function _jsonValidRequest(req)
|
||||||
{
|
{
|
||||||
if (req == undefined)
|
if (req == undefined)
|
||||||
@ -300,14 +263,14 @@ error = jsonrpc.createError(jsonrpc.Constant.ErrorOrigin.Server,
|
|||||||
scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse;
|
scriptTransportId = jsonrpc.Constant.ScriptTransport.NotInUse;
|
||||||
|
|
||||||
/* What type of request did we receive? */
|
/* What type of request did we receive? */
|
||||||
if (server["REQUEST_METHOD"] == "POST" &&
|
if (request["REQUEST_METHOD"] == "POST" &&
|
||||||
server["CONENT_TYPE"] == "text/json")
|
request["CONTENT_TYPE"] == "text/json")
|
||||||
{
|
{
|
||||||
/* We found literal POSTed json-rpc data (we hope) */
|
/* We found literal POSTed json-rpc data (we hope) */
|
||||||
input = request["POST_DATA"];
|
input = request["POST_DATA"];
|
||||||
jsonInput = Json.decode(input);
|
jsonInput = Json.decode(input);
|
||||||
}
|
}
|
||||||
else if (server["REQUEST_METHOD"] == "GET" &&
|
else if (request["REQUEST_METHOD"] == "GET" &&
|
||||||
form["_ScriptTransport_id"] != undefined &&
|
form["_ScriptTransport_id"] != undefined &&
|
||||||
form["_ScriptTransport_data"] != undefined)
|
form["_ScriptTransport_data"] != undefined)
|
||||||
{
|
{
|
||||||
@ -318,10 +281,6 @@ else if (server["REQUEST_METHOD"] == "GET" &&
|
|||||||
jsonInput = Json.decode(input);
|
jsonInput = Json.decode(input);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* KLUDGE... */
|
|
||||||
jsonInput = Json.decode(input);
|
|
||||||
/* ...KLUDGE */
|
|
||||||
|
|
||||||
/* Ensure that this was a JSON-RPC service request */
|
/* Ensure that this was a JSON-RPC service request */
|
||||||
if (! jsonrpc.validRequest(jsonInput))
|
if (! jsonrpc.validRequest(jsonInput))
|
||||||
{
|
{
|
||||||
@ -329,7 +288,7 @@ if (! jsonrpc.validRequest(jsonInput))
|
|||||||
* This request was not issued with JSON-RPC so echo the error rather than
|
* This request was not issued with JSON-RPC so echo the error rather than
|
||||||
* issuing a JsonRpcError response.
|
* 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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +203,38 @@ static int jsonrpc_include(int eid, int argc, char **argv)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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;
|
static void (*ejs_exception_handler) (const char *) = NULL;
|
||||||
|
|
||||||
@ -241,5 +273,6 @@ void smb_setup_ejs_functions(void (*exception_handler)(const char *))
|
|||||||
ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
|
ejsDefineStringCFunction(-1, "libinclude", ejs_libinclude, NULL, MPR_VAR_SCRIPT_HANDLE);
|
||||||
ejsDefineCFunction(-1, "version", ejs_version, 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, "jsonrpc_include", jsonrpc_include, NULL, MPR_VAR_SCRIPT_HANDLE);
|
||||||
|
ejsDefineStringCFunction(-1, "debug", ejs_debug, NULL, MPR_VAR_SCRIPT_HANDLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ static int ejs_sys_init(MprVarHandle eid, int argc, struct MprVar **argv)
|
|||||||
mprSetCFunction(obj, "interfaces", ejs_sys_interfaces);
|
mprSetCFunction(obj, "interfaces", ejs_sys_interfaces);
|
||||||
mprSetCFunction(obj, "hostname", ejs_sys_hostname);
|
mprSetCFunction(obj, "hostname", ejs_sys_hostname);
|
||||||
mprSetCFunction(obj, "nttime", ejs_sys_nttime);
|
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, "unix2nttime", ejs_sys_unix2nttime);
|
||||||
mprSetCFunction(obj, "gmmktime", ejs_sys_gmmktime);
|
mprSetCFunction(obj, "gmmktime", ejs_sys_gmmktime);
|
||||||
mprSetCFunction(obj, "gmtime", ejs_sys_gmtime);
|
mprSetCFunction(obj, "gmtime", ejs_sys_gmtime);
|
||||||
|
@ -36,6 +36,7 @@
|
|||||||
#define SWAT_SESSION_KEY "SwatSessionId"
|
#define SWAT_SESSION_KEY "SwatSessionId"
|
||||||
#define HTTP_PREAUTH_URI "/scripting/preauth.esp"
|
#define HTTP_PREAUTH_URI "/scripting/preauth.esp"
|
||||||
#define JSONRPC_REQUEST "/services"
|
#define JSONRPC_REQUEST "/services"
|
||||||
|
#define JSONRPC_SERVER "/services/request.esp"
|
||||||
|
|
||||||
/* state of the esp subsystem for a specific request */
|
/* state of the esp subsystem for a specific request */
|
||||||
struct esp_state {
|
struct esp_state {
|
||||||
@ -415,9 +416,10 @@ static void http_setup_arrays(struct esp_state *esp)
|
|||||||
SETVAR(ESP_REQUEST_OBJ, "CONTENT_LENGTH",
|
SETVAR(ESP_REQUEST_OBJ, "CONTENT_LENGTH",
|
||||||
talloc_asprintf(esp, "%u", web->input.content_length));
|
talloc_asprintf(esp, "%u", web->input.content_length));
|
||||||
SETVAR(ESP_REQUEST_OBJ, "QUERY_STRING", web->input.query_string);
|
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",
|
||||||
SETVAR(ESP_REQUEST_OBJ, "POST_DATA", web->input.partial);
|
talloc_strndup(esp,
|
||||||
#endif
|
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_METHOD", web->input.post_request?"POST":"GET");
|
||||||
SETVAR(ESP_REQUEST_OBJ, "REQUEST_URI", web->input.url);
|
SETVAR(ESP_REQUEST_OBJ, "REQUEST_URI", web->input.url);
|
||||||
p = strrchr(web->input.url, '/');
|
p = strrchr(web->input.url, '/');
|
||||||
@ -427,7 +429,6 @@ static void http_setup_arrays(struct esp_state *esp)
|
|||||||
struct MprVar mpv = mprObject("socket_address");
|
struct MprVar mpv = mprObject("socket_address");
|
||||||
mprSetPtrChild(&mpv, "socket_address", peer_address);
|
mprSetPtrChild(&mpv, "socket_address", peer_address);
|
||||||
espSetVar(req, ESP_REQUEST_OBJ, "REMOTE_SOCKET_ADDRESS", mpv);
|
espSetVar(req, ESP_REQUEST_OBJ, "REMOTE_SOCKET_ADDRESS", mpv);
|
||||||
|
|
||||||
SETVAR(ESP_REQUEST_OBJ, "REMOTE_ADDR", peer_address->addr);
|
SETVAR(ESP_REQUEST_OBJ, "REMOTE_ADDR", peer_address->addr);
|
||||||
}
|
}
|
||||||
p = socket_get_peer_name(web->conn->socket, esp);
|
p = socket_get_peer_name(web->conn->socket, esp);
|
||||||
@ -522,6 +523,30 @@ static void esp_request(struct esp_state *esp, const char *url)
|
|||||||
talloc_free(buf);
|
talloc_free(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
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
|
perform pre-authentication on every page is /scripting/preauth.esp
|
||||||
exists. If this script generates any non-whitepace output at all,
|
exists. If this script generates any non-whitepace output at all,
|
||||||
@ -859,7 +884,11 @@ void http_process_input(struct websrv_context *web)
|
|||||||
* Work out the mime type. First, we see if the request is a JSON-RPC
|
* Work out the mime type. First, we see if the request is a JSON-RPC
|
||||||
* service request. If not, we look at the extension.
|
* 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;
|
page_type = page_type_jsonrpc;
|
||||||
file_type = "text/json";
|
file_type = "text/json";
|
||||||
|
|
||||||
@ -876,6 +905,7 @@ void http_process_input(struct websrv_context *web)
|
|||||||
}
|
}
|
||||||
if (file_type == NULL) {
|
if (file_type == NULL) {
|
||||||
file_type = "text/html";
|
file_type = "text/html";
|
||||||
|
page_type = page_type_simple;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -908,11 +938,7 @@ void http_process_input(struct websrv_context *web)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case page_type_jsonrpc:
|
case page_type_jsonrpc:
|
||||||
#if 0 /* djl -- not yet */
|
jsonrpc_request(esp);
|
||||||
if (! jsonrpc_request(esp)) {
|
|
||||||
http_error(web, 500, "Out of memory");
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user