From d6d8ede6b9806540ddc15fd17f57c391321c7961 Mon Sep 17 00:00:00 2001 From: colm Date: Tue, 14 Feb 2017 19:47:00 -0500 Subject: [PATCH] FS-9952: Add query & tests for blade extention to rpc messages --- libs/libblade/src/blade_rpcproto.c | 63 +++++++++++++++++++--- libs/libblade/src/include/blade_rpcproto.h | 3 +- libs/libblade/test/testrpcproto.c | 40 ++++++++++++-- 3 files changed, 95 insertions(+), 11 deletions(-) diff --git a/libs/libblade/src/blade_rpcproto.c b/libs/libblade/src/blade_rpcproto.c index e955fffb56..3123a77118 100644 --- a/libs/libblade/src/blade_rpcproto.c +++ b/libs/libblade/src/blade_rpcproto.c @@ -812,6 +812,7 @@ KS_DECLARE(ks_rpcmessageid_t) blade_rpc_create_response(cJSON *request, } const char BLADE_JRPC_METHOD[] = "method"; +const char BLADE_JRPC_ID[] = "id"; const char BLADE_JRPC_FIELDS[] = "blade"; const char BLADE_JRPC_TO[] = "to"; const char BLADE_JRPC_FROM[] = "from"; @@ -822,15 +823,22 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message, char **namespaceP, char **methodP, char **versionP, + uint32_t *idP, blade_rpc_fields_t **fieldsP) { const char *m = cJSON_GetObjectCstr(message, BLADE_JRPC_METHOD); cJSON *blade = cJSON_GetObjectItem(message, BLADE_JRPC_FIELDS); + cJSON *jid = cJSON_GetObjectItem(message, BLADE_JRPC_ID); *fieldsP = NULL; *namespaceP = NULL; *versionP = NULL; *methodP = NULL; + *idP = 0; + + if (jid) { + *idP = jid->valueint; + } if (!m || !blade) { const char *buffer = cJSON_PrintUnformatted(message); @@ -839,20 +847,60 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message, return KS_STATUS_FAIL; } + cJSON *jto = cJSON_GetObjectItem(blade, BLADE_JRPC_TO); + cJSON *jfrom = cJSON_GetObjectItem(blade, BLADE_JRPC_FROM); + cJSON *jtoken = cJSON_GetObjectItem(blade, BLADE_JRPC_TOKEN); + + ks_size_t len = KS_RPCMESSAGE_COMMAND_LENGTH + 1 + KS_RPCMESSAGE_NAMESPACE_LENGTH + 1 + KS_RPCMESSAGE_VERSION_LENGTH + 1 + sizeof(blade_rpc_fields_t) + 1; + uint32_t lento = 0; + uint32_t lenfrom = 0; + uint32_t lentoken = 0; + + if (jto) { + lento = strlen(jto->valuestring) + 1; + len += lento; + } + + if (jfrom) { + lenfrom += strlen(jfrom->valuestring) + 1; + len += lenfrom; + } + + if (jtoken) { + lentoken += strlen(jtoken->valuestring) + 1; + len += lentoken; + } + blade_rpc_fields_t *fields = (blade_rpc_fields_t *)ks_pool_alloc(g_handle->pool, len); + + char *namespace = (char*)fields + sizeof(blade_rpc_fields_t); + char *command = namespace + KS_RPCMESSAGE_NAMESPACE_LENGTH + 1; + char *version = command + KS_RPCMESSAGE_COMMAND_LENGTH + 1; - fields->to = cJSON_GetObjectCstr(blade, BLADE_JRPC_TO); - fields->from = cJSON_GetObjectCstr(blade, BLADE_JRPC_FROM); - fields->from = cJSON_GetObjectCstr(blade, BLADE_JRPC_TOKEN); - - char *namespace = (char*)fields + sizeof(blade_rpc_fields_t); - char *command = namespace + KS_RPCMESSAGE_NAMESPACE_LENGTH + 1; - char *version = command + KS_RPCMESSAGE_COMMAND_LENGTH + 1; + char *ptr = version + KS_RPCMESSAGE_VERSION_LENGTH + 1; + + if (jto) { + strcpy(ptr, jto->valuestring); + fields->to = ptr; + ptr += strlen(jto->valuestring) + 1; + } + + if (jfrom) { + strcpy(ptr, jfrom->valuestring); + fields->from = ptr; + ptr += strlen(jfrom->valuestring) + 1; + } + + if (jtoken) { + strcpy(ptr, jtoken->valuestring); + fields->token = ptr; + ptr += strlen(jtoken->valuestring) + 1; + } blade_rpc_parse_fqcommand(m, namespace, command); @@ -861,6 +909,7 @@ KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message, *fieldsP = fields; *namespaceP = namespace; *methodP = command; + *versionP = version; return KS_STATUS_SUCCESS; } diff --git a/libs/libblade/src/include/blade_rpcproto.h b/libs/libblade/src/include/blade_rpcproto.h index 193c8604ab..3a8421c6da 100644 --- a/libs/libblade/src/include/blade_rpcproto.h +++ b/libs/libblade/src/include/blade_rpcproto.h @@ -130,7 +130,8 @@ KS_DECLARE(ks_rpcmessageid_t) blade_rpc_create_response(cJSON *request, KS_DECLARE(ks_status_t) blade_rpc_parse_message(cJSON *message, char **namespace, char **method, - char **version, + char **version, + uint32_t *idP, blade_rpc_fields_t **fieldsP); /* diff --git a/libs/libblade/test/testrpcproto.c b/libs/libblade/test/testrpcproto.c index 4679a7f277..2b5f28252f 100644 --- a/libs/libblade/test/testrpcproto.c +++ b/libs/libblade/test/testrpcproto.c @@ -29,7 +29,8 @@ static enum jrpc_status_t process_widget(cJSON *msg, cJSON **response) cJSON *resp = cJSON_CreateObject(); cJSON_AddNumberToObject(resp, "code", 199); - ks_rpcmessageid_t msgid = ks_rpcmessage_create_response(msg, &resp, response); + //ks_rpcmessageid_t msgid = ks_rpcmessage_create_response(msg, &resp, response); + ks_rpcmessageid_t msgid = blade_rpc_create_response(msg, &resp, response); char *b1 = cJSON_PrintUnformatted(*response); //(*response); printf("Response: msgid %d\n%s\n", msgid, b1); @@ -75,10 +76,27 @@ static enum jrpc_status_t process_wombat(cJSON *msg, cJSON **replyP) ks_pool_free(pool, &b1); } else { - printf("process_wombat_preresponse: unable to create response \n"); + printf("process_wombat: unable to create response \n"); return JRPC_ERROR; } + blade_rpc_fields_t *r_fields; + + char *r_method; + char *r_namespace; + char *r_version; + uint32_t r_id; + + ks_status_t s1 = blade_rpc_parse_message(msg, &r_namespace, &r_method, &r_version, &r_id, &r_fields); + + if (s1 == KS_STATUS_FAIL) { + printf("process_wombat: blade_rpc_parse_message failed\n"); + return JRPC_ERROR; + } + + printf("\nprocess_wombat: blade_rpc_parse_message namespace %s, method %s, id %d, version %s, to %s, from %s, token %s\n\n", + r_namespace, r_method, r_id, r_version, + r_fields->to, r_fields->from, r_fields->token); cJSON *parms2 = NULL; @@ -92,7 +110,23 @@ static enum jrpc_status_t process_wombat(cJSON *msg, cJSON **replyP) fields.token = token; // msgid = ks_rpcmessage_create_request("app1", "widget", &parms2, replyP); - msgid = blade_rpc_create_request("app1", "widget", &fields, &parms2, replyP); + msgid = blade_rpc_create_request(r_namespace, r_method, &fields, NULL, replyP); + + if (!msgid) { + printf("process wombat: create of next request failed\n"); + return JRPC_ERROR; + } + + b0 = cJSON_PrintUnformatted(*replyP); + + if (!b0) { + printf("process wombat: create of next request cannot be formatted\n"); + return JRPC_ERROR; + } + + + printf("\nprocess wombat: next request\n%s\n\n", b0); + printf("\n\nexiting process_wombat with a reply to send\n");