Merge origin/master
authorFulup Ar Foll <fulup@iot.bzh>
Tue, 22 Dec 2015 16:55:35 +0000 (17:55 +0100)
committerFulup Ar Foll <fulup@iot.bzh>
Tue, 22 Dec 2015 16:55:35 +0000 (17:55 +0100)
1  2 
src/rest-api.c

diff --combined src/rest-api.c
@@@ -230,7 -230,6 +230,7 @@@ STATIC AFB_error findAndCallApi (AFB_re
      int idx;
      AFB_error status;
      
 +    if (!request->api || !request->plugin) return (AFB_FAIL);
     
      // Search for a plugin with this urlpath
      for (idx = 0; request->plugins[idx] != NULL; idx++) {
      }
      // No plugin was found
      if (request->plugins[idx] == NULL) {
 -        request->jresp = jsonNewMessage(AFB_FATAL, "No Plugin=[%s]", request->plugin);
 +        request->jresp = jsonNewMessage(AFB_FATAL, "No Plugin=[%s] Url=%s", request->plugin, request->url);
          goto ExitOnError;
      }  
      
      // plugin callback did not return a valid Json Object
      if (status == AFB_FAIL) {
 -        request->jresp = jsonNewMessage(AFB_FATAL, "No API=[%s] for Plugin=[%s]", request->api, request->plugin);
 +        request->jresp = jsonNewMessage(AFB_FATAL, "No API=[%s] for Plugin=[%s] url=[%s]", request->api, request->plugin, request->url);
          goto ExitOnError;
      }
      
@@@ -322,16 -321,12 +322,16 @@@ STATIC AFB_request *createRequest (stru
      baseurl = strsep(&urlcpy2, "/");
      if (baseurl == NULL) {
          request->jresp = jsonNewMessage(AFB_FATAL, "Invalid API call url=[%s]", url);
 +        request->errcode = MHD_HTTP_BAD_REQUEST;
 +        goto Done;
      }
  
      // let's compute URL and call API
      baseapi = strsep(&urlcpy2, "/");
      if (baseapi == NULL) {
 -        request->jresp = jsonNewMessage(AFB_FATAL, "Invalid API call url=[%s]", url);
 +        request->jresp = jsonNewMessage(AFB_FATAL, "Invalid API call plugin=[%s] url=[%s]", baseurl, url);
 +        request->errcode = MHD_HTTP_BAD_REQUEST;
 +        goto Done;
      }
      
      // build request structure
      request->plugin = strdup (baseurl);
      request->api    = strdup (baseapi);
      request->plugins= session->plugins;
 -    
 +
 +Done:    
      free(urlcpy1);
      return (request);
  }
@@@ -389,8 -383,10 +389,8 @@@ PUBLIC int doRestApi(struct MHD_Connect
                  if (verbose) fprintf(stderr, "Create PostForm[uid=%d]\n", postHandle->uid);
  
                  request = createRequest (connection, session, url);
 -                if (request->jresp != NULL) {
 -                    errMessage = request->jresp;
 -                    goto ExitOnError;
 -                }
 +                if (request->jresp != NULL) goto ProcessApiCall;
 +
                  postHandle = malloc(sizeof (AFB_PostHandle)); // allocate application POST processor handle
                  postHandle->type   = AFB_POST_FORM;
                  postHandle->pp     = MHD_create_post_processor (connection, MAX_POST_SIZE, doPostIterate, postHandle);
@@@ -575,9 -571,10 +575,10 @@@ void initPlugins(AFB_session *session) 
      struct dirent *pluginDir;
      DIR *dir;
      afbJsonType = json_object_new_string (AFB_MSG_JTYPE);
-     int i = 0;
+     int num = 0;
  
-     plugins = (AFB_plugin **) malloc (sizeof(AFB_plugin));
+     /* pre-allocate for 20 plugins, we will downsize if necessary */
+     plugins = (AFB_plugin **) malloc (20*sizeof(AFB_plugin));
  
      if ((dir = opendir(session->config->plugins)) == NULL) {
          fprintf(stderr, "Could not open plugin directory [%s], exiting...\n", session->config->plugins);
          pluginRegisterFct = dlsym (plugin, "pluginRegister");
          free (pluginPath);
          if (!plugin) {
-             if (verbose) fprintf(stderr, "[%s] is not a binary plugin, continuing...\n", pluginDir->d_name);
+             if (verbose) fprintf(stderr, "[%s] is not loadable, continuing...\n", pluginDir->d_name);
              continue;
          } else if (!pluginRegisterFct) {
              if (verbose) fprintf(stderr, "[%s] is not an AFB plugin, continuing...\n", pluginDir->d_name);
          }
  
          if (verbose) fprintf(stderr, "[%s] is a valid AFB plugin, loading it\n", pluginDir->d_name);
-         plugins = (AFB_plugin **) realloc (plugins, (i+1)*sizeof(AFB_plugin));
-         plugins[i] = (AFB_plugin *) malloc (sizeof(AFB_plugin));
-         plugins[i] = (**pluginRegisterFct)();
-         i++;
+         plugins[num] = (AFB_plugin *) malloc (sizeof(AFB_plugin));
+         plugins[num] = (**pluginRegisterFct)();
+         num++;
+         /* only 20 plugins are supported at that time */
+         if (num == 20) break;
      }
-     plugins[i] = NULL;
+     plugins = (AFB_plugin **) realloc (plugins, (num+1)*sizeof(AFB_plugin));
+     plugins[num] = NULL;
  
      closedir (dir);
  
  
      // complete plugins and save them within current sessions    
      session->plugins = RegisterJsonPlugins(plugins);
+     session->pluginCount = num;
  }