X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=plugins%2Fsamples%2FSamplePost.c;h=53d065ae3a2b8dc75ab6832948c385e9a3067d46;hb=923ae026828a5cd325cb0dc658c78f50d029b1bf;hp=223f74e8650c975ef9553e04b6b45122e257717f;hpb=98f5843474dcec55827279b6f42007341c171ae0;p=src%2Fapp-framework-binder.git diff --git a/plugins/samples/SamplePost.c b/plugins/samples/SamplePost.c index 223f74e8..53d065ae 100644 --- a/plugins/samples/SamplePost.c +++ b/plugins/samples/SamplePost.c @@ -19,14 +19,6 @@ #include "local-def.h" - -// In this case or handle is quite basic -typedef struct { - int fd; - char *path; - json_object* jerror; -} appPostCtx; - // With content-type=json data are directly avaliable in request->post->data STATIC json_object* GetJsonByPost (AFB_request *request) { json_object* jresp; @@ -46,122 +38,69 @@ STATIC json_object* GetJsonByPost (AFB_request *request) { return (jresp); } -// This function is call when PostForm processing is completed -STATIC void DonePostForm (AFB_request *request) { - - // Retrieve PostHandle Context from request - AFB_PostHandle *postHandle = getPostHandle(request); - appPostCtx *appCtx= (appPostCtx*) postHandle->ctx; - - if (verbose) fprintf (stderr, "DonePostForm file=[%s]upload done\n", appCtx->path); - - -} -// PostForm callback is called multiple times (one or each key within form, or once per file buffer) -// When processing POST_FORM request->data holds a PostHandle and not data directly as for POST_JSON -// When file has been fully uploaded call is call with item==NULL it is application responsibility to free appPostCtx -STATIC json_object* UploadFile (AFB_request *request, AFB_PostItem *item) { +// Upload a file and execute a function when upload is done +STATIC json_object* UploadAppli (AFB_request *request, AFB_PostItem *item) { + + char *destination = "applications"; - AFB_PostHandle *postHandle = getPostHandle(request); - appPostCtx *appCtx; - char filepath[512]; - int len; - // This is called after PostForm and then after DonePostForm if (item == NULL) { - json_object* jresp; - appCtx = (appPostCtx*) postHandle->ctx; - - // No Post Application Context [something really bad happen] - if (appCtx == NULL) { - request->errcode = MHD_HTTP_EXPECTATION_FAILED; - return(jsonNewMessage(AFB_FAIL,"Error: PostForm no PostContext to free\n")); + AFB_PostCtx *postFileCtx = getPostContext(request); + if (postFileCtx != NULL) { + // Do something intelligent here to install application + + postFileCtx->errcode = MHD_HTTP_OK; // or error is something went wrong; + postFileCtx->jresp = jsonNewMessage(AFB_SUCCESS,"UploadFile Post Appli done"); } - - // We have a context but last Xform iteration fail. - if (appCtx->jerror != NULL) { - request->errcode = MHD_HTTP_EXPECTATION_FAILED; - jresp = appCtx->jerror; // retrieve previous error from postCtx - } else jresp = jsonNewMessage(AFB_FAIL,"UploadFile Post Request file=[%s] done", appCtx->path); - - // Error or not let's free all resources - close(appCtx->fd); - free (appCtx->path); - free (appCtx); - return (jresp); } - // Make sure it's a valid PostForm request - if (!request->post && request->post->type != AFB_POST_FORM) { - appCtx->jerror= jsonNewMessage(AFB_FAIL,"This is not a valid PostForm request\n"); - goto ExitOnError; - } - - // Check this is a file element - if (item->filename == NULL) { - appCtx->jerror= jsonNewMessage(AFB_FAIL,"No Filename attached to key=%s\n", item->key); - goto ExitOnError; - } + // upload multi iteration logic is handle by getPostedFile + return (getPostFile (request, item, destination)); +} + +// Simples Upload case just upload a file +STATIC json_object* UploadMusic (AFB_request *request, AFB_PostItem *item) { - // Check we got something in buffer - if (item->len <= 0) { - appCtx->jerror= jsonNewMessage(AFB_FAIL,"Buffer size NULL key=%s]\n", item->key); - goto ExitOnError; - } + // upload multi iteration logic is handle by getPostedFile + return (getPostFile (request, item, "musics")); +} - // Extract Application Context from posthandle [NULL == 1st iteration] - appCtx = (appPostCtx*) postHandle->ctx; +// PostForm callback is called multiple times (one or each key within form, or once per file buffer) +// When file has been fully uploaded call is call with item==NULL +STATIC json_object* UploadImage (AFB_request *request, AFB_PostItem *item) { + + // note if directory is relative it will be prefixed by request->config->sessiondir + char *destination = "images"; - // This is the 1st Item iteration let's open output file and allocate necessary resources - if (appCtx == NULL) { - // Create an application specific context - appCtx = calloc (1, sizeof(appPostCtx)); // May place anything here until post->completeCB handle resources liberation - appCtx->path = strdup (filepath); - - // attach application to postHandle - postHandle->ctx = (void*) appCtx; // May place anything here until post->completeCB handle resources liberation + // This is called after PostForm and then after DonePostForm + if (item == NULL) { + AFB_PostCtx *postFileCtx = getPostContext(request); - // Allocate an application specific handle to this post - strncpy (filepath, request->config->sessiondir, sizeof(filepath)); - strncat (filepath, "/", sizeof(filepath)); - strncat (filepath, item->filename, sizeof(filepath)); - - if((appCtx->fd = open(filepath, O_RDWR |O_CREAT, S_IRWXU|S_IRGRP)) < 0) { - appCtx->jerror= jsonNewMessage(AFB_FAIL,"Fail to Create destination=[%s] error=%s\n", filepath, strerror(errno)); - goto ExitOnError; - } - } else { - // reuse existing application context - appCtx = (appPostCtx*) postHandle->ctx; - } - - // Check we successfully wrote full buffer - len = write (appCtx->fd, item->data, item->len); - if (item->len != len) { - appCtx->jerror= jsonNewMessage(AFB_FAIL,"Fail to write file [%s] at [%s] error=\n", item->filename, strerror(errno)); - goto ExitOnError; + // if postFileCtx == NULL then an error happen [getPostedFile automatically reports errors] + if (postFileCtx != NULL) { + // Do something with your newly upload filepath=postFileCtx->path + request->errcode = MHD_HTTP_OK; + request->jresp = jsonNewMessage(AFB_FAIL,"UploadFile Post Image done"); + + // Note: should not return here in order getPostedFile to clear Post resources. + } } - - // every intermediary iteration should return Success & NULL - request->errcode = MHD_HTTP_OK; - return NULL; -ExitOnError: - request->errcode = MHD_HTTP_EXPECTATION_FAILED; - return NULL; + // upload multi iteration logic is handle by getPostedFile + return (getPostFile (request, item, destination)); } // NOTE: this sample does not use session to keep test a basic as possible // in real application upload-xxx should be protected with AFB_SESSION_CHECK STATIC AFB_restapi pluginApis[]= { - {"ping" , AFB_SESSION_NONE , (AFB_apiCB)apiPingTest ,"Ping Rest Test Service"}, + {"ping" , AFB_SESSION_NONE , (AFB_apiCB)getPingTest ,"Ping Rest Test Service"}, {"upload-json" , AFB_SESSION_NONE , (AFB_apiCB)GetJsonByPost ,"Demo for Json Buffer on Post"}, - {"upload-image" , AFB_SESSION_NONE , (AFB_apiCB)UploadFile ,"Demo for file upload"}, - {"upload-music" , AFB_SESSION_NONE , (AFB_apiCB)UploadFile ,"Demo for file upload"}, - {"upload-appli" , AFB_SESSION_NONE , (AFB_apiCB)UploadFile ,"Demo for file upload"}, + {"upload-image" , AFB_SESSION_NONE , (AFB_apiCB)UploadImage ,"Demo for file upload"}, + {"upload-music" , AFB_SESSION_NONE , (AFB_apiCB)UploadMusic ,"Demo for file upload"}, + {"upload-appli" , AFB_SESSION_NONE , (AFB_apiCB)UploadAppli ,"Demo for file upload"}, {NULL} };