#include <json-c/json.h>
#include <microhttpd.h>
+#if MHD_VERSION < 0x00095206
+# define MHD_ALLOW_SUSPEND_RESUME MHD_USE_SUSPEND_RESUME
+#endif
#include "afb-method.h"
#include "afb-context.h"
struct afb_hsrv *hsrv;
struct hsrv_handler *iter;
const char *type;
+ enum json_tokener_error jerr;
hsrv = cls;
hreq = *recordreq;
}
} else if (hreq->tokener) {
hreq->json = json_tokener_parse_ex(hreq->tokener, upload_data, (int)*upload_data_size);
- switch (json_tokener_get_error(hreq->tokener)) {
- case json_tokener_success:
- case json_tokener_continue:
- break;
- default:
- ERROR("error in POST json: %s", json_tokener_error_desc(json_tokener_get_error(hreq->tokener)));
+ jerr = json_tokener_get_error(hreq->tokener);
+ if (jerr == json_tokener_continue) {
+ hreq->json = json_tokener_parse_ex(hreq->tokener, "", 1);
+ jerr = json_tokener_get_error(hreq->tokener);
+ }
+ if (jerr != json_tokener_success) {
+ ERROR("error in POST json: %s", json_tokener_error_desc(jerr));
afb_hreq_reply_error(hreq, MHD_HTTP_BAD_REQUEST);
return MHD_YES;
}
}
/* no handler */
- WARNING("Unhandled request to %s", hreq->url);
+ NOTICE("Unhandled request to %s", hreq->url);
afb_hreq_reply_error(hreq, MHD_HTTP_NOT_FOUND);
return MHD_YES;
}
fdev_set_events(hsrv->fdev, EPOLLIN);
}
-void run_micro_httpd(struct afb_hsrv *hsrv)
+void afb_hsrv_run(struct afb_hsrv *hsrv)
{
fdev_set_events(hsrv->fdev, 0);
if (jobs_queue(hsrv, 0, do_run, hsrv) < 0)
static void listen_callback(void *hsrv, uint32_t revents, struct fdev *fdev)
{
- run_micro_httpd(hsrv);
+ afb_hsrv_run(hsrv);
}
static int new_client_handler(void *cls, const struct sockaddr *addr, socklen_t addrlen)
const union MHD_DaemonInfo *info;
httpd = MHD_start_daemon(
- MHD_USE_EPOLL | MHD_ALLOW_UPGRADE | MHD_USE_TCP_FASTOPEN | MHD_USE_DEBUG | MHD_USE_SUSPEND_RESUME,
+ MHD_USE_EPOLL | MHD_ALLOW_UPGRADE | MHD_USE_TCP_FASTOPEN | MHD_USE_DEBUG | MHD_ALLOW_SUSPEND_RESUME,
port, /* port */
new_client_handler, NULL, /* Tcp Accept call back + extra attribute */
access_handler, hsrv, /* Http Request Call back + extra attribute */