X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Frest-api.c;h=b83e8932289f15422183654a4ea2908a234a6d89;hb=6930cdc6c322f88d1f3cc99622941e3d5037f74a;hp=e1c3756c9ee7b61d9fd7741ddb7398d40f862bff;hpb=a4b35de73384d4394b5201838c1c785355d9a7fd;p=src%2Fapp-framework-binder.git diff --git a/src/rest-api.c b/src/rest-api.c index e1c3756c..b83e8932 100644 --- a/src/rest-api.c +++ b/src/rest-api.c @@ -45,7 +45,7 @@ PUBLIC void endPostRequest(AFB_PostHandle *postHandle) { if (postHandle->type == AFB_POST_FORM) { if (verbose) fprintf(stderr, "End PostForm Request UID=%d\n", postHandle->uid); } - if (postHandle->private) free(postHandle->private); + if (postHandle->privatebuf) free(postHandle->privatebuf); free(postHandle); } @@ -107,7 +107,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("fail")); json_object_object_add(jcall, "info", json_object_new_string ("Setting Timeout Handler Failed")); json_object_object_add(jreqt, "request", jcall); - return AFB_DONE; + goto ExitOnDone; } } // Trigger a timer to protect from unacceptable long time execution @@ -124,7 +124,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("fail")); json_object_object_add(jcall, "info", json_object_new_string ("Client Session Context Full !!!")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; }; if (verbose) fprintf(stderr, "Plugin=[%s] Api=[%s] Middleware=[%d] Client=[0x%x] Uuid=[%s] Token=[%s]\n" @@ -132,13 +132,13 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) switch(plugin->apis[idx].session) { - case AFB_SESSION_CREATE: - if (clientCtx->token[0] != '\0') { + case AFB_SESSION_CREATE: + if (clientCtx->token[0] != '\0' && request->config->token[0] != '\0') { request->errcode=MHD_HTTP_UNAUTHORIZED; json_object_object_add(jcall, "status", json_object_new_string ("exist")); json_object_object_add(jcall, "info", json_object_new_string ("AFB_SESSION_CREATE Session already exist")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; } if (AFB_SUCCESS != ctxTokenCreate (clientCtx, request)) { @@ -146,7 +146,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("fail")); json_object_object_add(jcall, "info", json_object_new_string ("AFB_SESSION_CREATE Invalid Initial Token")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; } else { json_object_object_add(jcall, "uuid", json_object_new_string (clientCtx->uuid)); json_object_object_add(jcall, "token", json_object_new_string (clientCtx->token)); @@ -161,7 +161,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("fail")); json_object_object_add(jcall, "info", json_object_new_string ("AFB_SESSION_REFRESH Broken Exchange Token Chain")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; } else { json_object_object_add(jcall, "uuid", json_object_new_string (clientCtx->uuid)); json_object_object_add(jcall, "token", json_object_new_string (clientCtx->token)); @@ -175,7 +175,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("empty")); json_object_object_add(jcall, "info", json_object_new_string ("AFB_SESSION_CLOSE Not a Valid Access Token")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; } else { json_object_object_add(jcall, "uuid", json_object_new_string (clientCtx->uuid)); } @@ -189,7 +189,7 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) json_object_object_add(jcall, "status", json_object_new_string ("fail")); json_object_object_add(jcall, "info", json_object_new_string ("AFB_SESSION_CHECK Invalid Active Token")); json_object_object_add(jreqt, "request", jcall); - return (AFB_DONE); + goto ExitOnDone; } break; } @@ -198,9 +198,6 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) // Effectively CALL PLUGIN API with a subset of the context jresp = plugin->apis[idx].callback(request, context); - // prefix response with request object; - request->jresp = jreqt; - // Store context in case it was updated by plugins if (request->context != NULL) clientCtx->contexts[plugidx] = request->context; @@ -213,13 +210,13 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) // API should return NULL of a valid Json Object if (jresp == NULL) { json_object_object_add(jcall, "status", json_object_new_string ("null")); - json_object_object_add(request->jresp, "request", jcall); + json_object_object_add(jreqt, "request", jcall); request->errcode = MHD_HTTP_NO_RESPONSE; } else { json_object_object_add(jcall, "status", json_object_new_string ("processed")); - json_object_object_add(request->jresp, "request", jcall); - json_object_object_add(request->jresp, "response", jresp); + json_object_object_add(jreqt, "request", jcall); + json_object_object_add(jreqt, "response", jresp); } // cancel timeout and plugin signal handle before next call if (request->config->apiTimeout > 0) { @@ -229,10 +226,14 @@ STATIC AFB_error callPluginApi(AFB_request *request, int plugidx, void *context) } } } - return (AFB_DONE); + goto ExitOnDone; } } return (AFB_FAIL); + +ExitOnDone: + request->jresp = jreqt; + return (AFB_DONE); } STATIC AFB_error findAndCallApi (AFB_request *request, void *context) { @@ -280,10 +281,11 @@ STATIC int doPostIterate (void *cls, enum MHD_ValueKind kind, const char *key, // retrieve API request from Post iterator handle AFB_PostHandle *postHandle = (AFB_PostHandle*)cls; - AFB_request *request = (AFB_request*)postHandle->private; + AFB_request *request = (AFB_request*)postHandle->privatebuf; AFB_PostRequest postRequest; - fprintf (stderr, "postHandle key=%s filename=%s len=%d mime=%s\n", key, filename, size, mimetype); + if (verbose) + fprintf (stderr, "postHandle key=%s filename=%s len=%d mime=%s\n", key, filename, size, mimetype); // Create and Item value for Plugin API item.kind = kind; @@ -404,7 +406,7 @@ PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, co request = createRequest (connection, session, url); if (request->jresp != NULL) goto ProcessApiCall; postHandle->type = AFB_POST_FORM; - postHandle->private= (void*)request; + postHandle->privatebuf = (void*)request; postHandle->pp = MHD_create_post_processor (connection, MAX_POST_SIZE, &doPostIterate, postHandle); if (NULL == postHandle->pp) { @@ -429,7 +431,7 @@ PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, co // Size is OK, let's allocate a buffer to hold post data postHandle->type = AFB_POST_JSON; - postHandle->private = malloc(contentlen + 1); // allocate memory for full POST data + 1 for '\0' enf of string + postHandle->privatebuf = malloc(contentlen + 1); // allocate memory for full POST data + 1 for '\0' enf of string // if (verbose) fprintf(stderr, "Create PostJson[uid=%d] Size=%d\n", postHandle->uid, contentlen); return MHD_YES; @@ -454,7 +456,7 @@ PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, co // Process JsonPost request when buffer is completed let's call API if (postHandle->type == AFB_POST_JSON) { // if (verbose) fprintf(stderr, "Updating PostJson[uid=%d]\n", postHandle->uid); - memcpy(&postHandle->private[postHandle->len], upload_data, *upload_data_size); + memcpy(&postHandle->privatebuf[postHandle->len], upload_data, *upload_data_size); postHandle->len = postHandle->len + *upload_data_size; } @@ -490,8 +492,8 @@ PUBLIC int doRestApi(struct MHD_Connection *connection, AFB_session *session, co } // Before processing data, make sure buffer string is properly ended - postHandle->private[postHandle->len] = '\0'; - postRequest.data = postHandle->private; + postHandle->privatebuf[postHandle->len] = '\0'; + postRequest.data = postHandle->privatebuf; request->post = &postRequest; // if (verbose) fprintf(stderr, "Close Post[%d] Buffer=%s\n", postHandle->uid, request->post->data); @@ -512,7 +514,7 @@ ProcessApiCall: // client did not pass token on URI let's use cookies if ((!request->restfull) && (request->context != NULL)) { char cookie[256]; - snprintf (cookie, sizeof (cookie), "%s=%s;path=%s;max-age=%d", COOKIE_NAME, request->uuid, request->config->rootapi,request->config->cntxTimeout); + snprintf (cookie, sizeof (cookie), "%s-%d=%s; Path=%s; Max-Age=%d; HttpOnly", COOKIE_NAME, request->config->httpdPort, request->uuid, request->config->rootapi,request->config->cntxTimeout); MHD_add_response_header (webResponse, MHD_HTTP_HEADER_SET_COOKIE, cookie); } @@ -562,15 +564,15 @@ STATIC AFB_plugin ** RegisterJsonPlugins(AFB_plugin **plugins) { // Prebuild each API jtype to boost API json response for (jdx = 0; plugins[idx]->apis[jdx].name != NULL; jdx++) { - AFB_privateApi *private = malloc (sizeof (AFB_privateApi)); - if (plugins[idx]->apis[jdx].private != NULL) { + AFB_privateApi *privateapi = malloc (sizeof (AFB_privateApi)); + if (plugins[idx]->apis[jdx].privateapi != NULL) { fprintf (stderr, "WARNING: plugin=%s api=%s private handle should be NULL=0x%x\n" - ,plugins[idx]->prefix,plugins[idx]->apis[jdx].name, plugins[idx]->apis[jdx].private); + ,plugins[idx]->prefix,plugins[idx]->apis[jdx].name, plugins[idx]->apis[jdx].privateapi); } - private->len = strlen (plugins[idx]->apis[jdx].name); - private->jtype=json_object_new_string(plugins[idx]->apis[jdx].name); - json_object_get(private->jtype); // increase reference count to make it permanent - plugins[idx]->apis[jdx].private = private; + privateapi->len = strlen (plugins[idx]->apis[jdx].name); + privateapi->jtype=json_object_new_string(plugins[idx]->apis[jdx].name); + json_object_get(privateapi->jtype); // increase reference count to make it permanent + plugins[idx]->apis[jdx].privateapi = privateapi; } } } @@ -637,8 +639,10 @@ STATIC void scanDirectory(char *dirpath, int dirfd, AFB_plugin **plugins, int *c if (verbose) fprintf(stderr, "[%s] is a valid AFB plugin, loading pos[%d]\n", pluginDir.d_name, *count); plugins[*count] = pluginRegisterFct(); - *count = *count +1; - + if (!plugins[*count]) { + if (verbose) fprintf(stderr, "ERROR: plugin [%s] register function failed. continuing...\n", pluginDir.d_name); + } else + *count = *count +1; } } closedir (dir);