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);
}
}
}
// Trigger a timer to protect from unacceptable long time execution
- alarm (request->config->apiTimeout);
+ alarm ((unsigned)request->config->apiTimeout);
}
// Out of SessionNone every call get a client context session
goto ExitOnDone;
};
- if (verbose) fprintf(stderr, "Plugin=[%s] Api=[%s] Middleware=[%d] Client=[0x%x] Uuid=[%s] Token=[%s]\n"
+ if (verbose) fprintf(stderr, "Plugin=[%s] Api=[%s] Middleware=[%d] Client=[%p] Uuid=[%s] Token=[%s]\n"
, request->prefix, request->api, plugin->apis[idx].session, clientCtx, clientCtx->uuid, clientCtx->token);
switch(plugin->apis[idx].session) {
- case AFB_SESSION_CREATE:
+ 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"));
// 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=%zu mime=%s\n", key, filename, size, mimetype);
// Create and Item value for Plugin API
item.kind = kind;
STATIC AFB_request *createRequest (struct MHD_Connection *connection, AFB_session *session, const char* url) {
AFB_request *request;
- int idx;
// Start with a clean request
request = calloc (1, sizeof (AFB_request));
AFB_PostRequest postRequest;
int ret;
- // fprintf (stderr, "doRestAPI method=%s posthandle=0x%x\n", method, con_cls);
+ // fprintf (stderr, "doRestAPI method=%s posthandle=%p\n", method, con_cls);
// if post data may come in multiple calls
if (0 == strcmp(method, MHD_HTTP_METHOD_POST)) {
// Form post is handle through a PostProcessor and call API once per form key
if (strcasestr(encoding, FORM_CONTENT) != NULL) {
- if (verbose) fprintf(stderr, "Create doPostIterate[uid=%d posthandle=0x%x]\n", postHandle->uid, postHandle);
+ if (verbose) fprintf(stderr, "Create doPostIterate[uid=%d posthandle=%p]\n", postHandle->uid, postHandle);
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) {
// 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((unsigned)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;
// 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;
}
}
// 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);
// 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);
}
// 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) {
- 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);
+ 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=%p\n"
+ ,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 = (int)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;
}
}
}
// if max plugin is reached let's stop searching
if (*count == AFB_MAX_PLUGINS) {
- fprintf(stderr, "[%s] is not loaded [Max Count=%d reached]\n", *count);
+ fprintf(stderr, "[%s] is not loaded [Max Count=%d reached]\n", pluginDir.d_name, *count);
continue;
}
if (verbose) fprintf(stderr, "[%s] is a valid AFB plugin, loading pos[%d]\n", pluginDir.d_name, *count);
- plugins[*count] = (AFB_plugin *) malloc (sizeof(AFB_plugin));
- plugins[*count] = (**pluginRegisterFct)();
- *count = *count +1;
-
+ plugins[*count] = pluginRegisterFct();
+ if (!plugins[*count]) {
+ if (verbose) fprintf(stderr, "ERROR: plugin [%s] register function failed. continuing...\n", pluginDir.d_name);
+ } else
+ *count = *count +1;
}
}
closedir (dir);
}
void initPlugins(AFB_session *session) {
- static AFB_plugin **plugins;
+ AFB_plugin **plugins;
afbJsonType = json_object_new_string (AFB_MSG_JTYPE);
int count = 0;
int dirfd;
/* pre-allocate for AFB_MAX_PLUGINS plugins, we will downsize later */
- plugins = (AFB_plugin **) malloc (AFB_MAX_PLUGINS *sizeof(AFB_plugin));
+ plugins = (AFB_plugin **) malloc (AFB_MAX_PLUGINS *sizeof(AFB_plugin*));
// Loop on every directory passed in --plugins=xxx
- while (dirpath = strsep(&session->config->ldpaths, ":")) {
+ while ((dirpath = strsep(&session->config->ldpaths, ":"))) {
// Ignore any directory we fail to open
if ((dirfd = open(dirpath, O_DIRECTORY)) <= 0) {
fprintf(stderr, "Invalid directory path=[%s]\n", dirpath);
}
// downsize structure to effective number of loaded plugins
- plugins = (AFB_plugin **)realloc (plugins, (count+1)*sizeof(AFB_plugin));
+ plugins = (AFB_plugin **)realloc (plugins, (unsigned)(count+1)*sizeof(AFB_plugin*));
plugins[count] = NULL;
// complete plugins and save them within current sessions