summaryrefslogtreecommitdiffstats
path: root/plugins/samples/SamplePost.c
diff options
context:
space:
mode:
authorFulup Ar Foll <fulup@iot.bzh>2015-12-21 16:33:23 +0100
committerFulup Ar Foll <fulup@iot.bzh>2015-12-21 16:33:23 +0100
commit5472e85501418302959040eacb819c57f849d63e (patch)
treef2f7d5e7b67b1ae73184137e418106c9b21a78cd /plugins/samples/SamplePost.c
parent33c9353cce432422fea4ba61ab17b20dd8cfe800 (diff)
Hack --plugins=path
Diffstat (limited to 'plugins/samples/SamplePost.c')
-rw-r--r--plugins/samples/SamplePost.c148
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}
};