+STATIC AFB_error findAndCallApi (struct MHD_Connection *connection, AFB_session *session, const char* url, AFB_request *request) {
+ int idx;
+ char *baseurl, *baseapi;
+ AFB_error status;
+
+ // build request structure
+ memset(request, 0, sizeof (request));
+ request->connection = connection;
+ request->config = session->config;
+ request->url = url;
+ request->plugin = baseurl;
+ request->api = baseapi;
+ request->jresp = json_object_new_object();
+
+ // increase reference count and add jtype to response
+ json_object_get (afbJsonType);
+ json_object_object_add (request->jresp, "jtype", afbJsonType);
+
+ // Search for a plugin with this urlpath
+ for (idx = 0; session->plugins[idx] != NULL; idx++) {
+ if (!strcmp(session->plugins[idx]->prefix, baseurl)) {
+ status =callPluginApi(session->plugins[idx], request);
+ break;
+ }
+ }
+ // No plugin was found
+ if (session->plugins[idx] == NULL) {
+ request->jresp = jsonNewMessage(AFB_FATAL, "No Plugin=[%s]", request->plugin);
+ request->errcode = MHD_HTTP_UNPROCESSABLE_ENTITY;
+ return (AFB_FAIL);
+ }
+
+ // plugin callback did not return a valid Json Object
+ if (status != AFB_DONE) {
+ request->jresp = jsonNewMessage(AFB_FATAL, "No API=[%s] for Plugin=[%s]", request->api, request->plugin);
+ request->errcode = MHD_HTTP_UNPROCESSABLE_ENTITY;
+ return (AFB_FAIL);
+ }
+
+ return (status);
+}