diff options
Diffstat (limited to 'plugins/samples/SamplePost.c')
-rw-r--r-- | plugins/samples/SamplePost.c | 148 |
1 files changed, 45 insertions, 103 deletions
diff --git a/plugins/samples/SamplePost.c b/plugins/samples/SamplePost.c index 223f74e8..56c3f24b 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,72 @@ 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) { + + // request Application Framework to install application + + request->errcode = MHD_HTTP_OK; // or error is something went wrong; + request->jresp = jsonNewMessage(AFB_FAIL,"UploadFile Post Request file=[%s] done", postFileCtx->path); } - - // 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; - } - - // 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, destination)); +} - // Extract Application Context from posthandle [NULL == 1st iteration] - appCtx = (appPostCtx*) postHandle->ctx; +// Simples Upload case just upload a file +STATIC json_object* UploadMusic (AFB_request *request, AFB_PostItem *item) { + + char *destination = "musics"; - // 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 - - // 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)); + // upload multi iteration logic is handle by getPostedFile + return (getPostFile (request, item, destination)); +} - 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; - } +// 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"; - // 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; + // This is called after PostForm and then after DonePostForm + if (item == NULL) { + AFB_PostCtx *postFileCtx = getPostContext(request); + + // 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 Request file=[%s] done", postFileCtx->path); + + // 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} }; |