#include "local-def.h"
#include "afb-method.h"
#include "afb-hreq.h"
+#include "afb-hsrv.h"
#include "afb-websock.h"
#include "afb-apis.h"
#include "afb-req-itf.h"
int dirfd;
};
-static struct upoll *upoll = NULL;
-
-int afb_hreq_one_page_api_redirect(
- struct afb_hreq *hreq,
- void *data)
-{
- size_t plen;
- char *url;
+struct afb_hsrv {
+ struct MHD_Daemon *httpd;
+ struct afb_hsrv_handler *handlers;
+ struct upoll *upoll;
+};
- if (hreq->lentail >= 2 && hreq->tail[1] == '#')
- return 0;
- /*
- * Here we have for example:
- * url = "/pre/dir/page" lenurl = 13
- * tail = "/dir/page" lentail = 9
- *
- * We will produce "/pre/#!dir/page"
- *
- * Let compute plen that include the / at end (for "/pre/")
- */
- plen = hreq->lenurl - hreq->lentail + 1;
- url = alloca(hreq->lenurl + 3);
- memcpy(url, hreq->url, plen);
- url[plen++] = '#';
- url[plen++] = '!';
- memcpy(&url[plen], &hreq->tail[1], hreq->lentail);
- return afb_hreq_redirect_to(hreq, url);
-}
+static struct upoll *upoll = NULL;
static struct afb_hsrv_handler *new_handler(
struct afb_hsrv_handler *head,
return 1;
}
+int afb_hreq_one_page_api_redirect(
+ struct afb_hreq *hreq,
+ void *data)
+{
+ size_t plen;
+ char *url;
+
+ if (hreq->lentail >= 2 && hreq->tail[1] == '#')
+ return 0;
+ /*
+ * Here we have for example:
+ * url = "/pre/dir/page" lenurl = 13
+ * tail = "/dir/page" lentail = 9
+ *
+ * We will produce "/pre/#!dir/page"
+ *
+ * Let compute plen that include the / at end (for "/pre/")
+ */
+ plen = hreq->lenurl - hreq->lentail + 1;
+ url = alloca(hreq->lenurl + 3);
+ memcpy(url, hreq->url, plen);
+ url[plen++] = '#';
+ url[plen++] = '!';
+ memcpy(&url[plen], &hreq->tail[1], hreq->lentail);
+ return afb_hreq_redirect_to(hreq, url);
+}
+
static int afb_hreq_websocket_switch(struct afb_hreq *hreq, void *data)
{
int later;
return 0;
if (!later) {
- struct afb_websock *ws = afb_websock_create(hreq->connection);
- if (ws == NULL) {
- /* TODO */
- } else {
- /* TODO */
- }
+ struct afb_websock *ws = afb_websock_create(hreq);
+ if (ws != NULL)
+ hreq->upgrade = 1;
}
return 1;
}
hreq->postform = MHD_create_post_processor (connection, 65500, postproc, hreq);
if (hreq->postform == NULL)
goto internal_error;
+ return MHD_YES;
} else if (strcasestr(type, JSON_CONTENT) == NULL) {
afb_hsrv_reply_error(connection, MHD_HTTP_UNSUPPORTED_MEDIA_TYPE);
return MHD_YES;
struct afb_hreq *hreq;
hreq = *recordreq;
-
+ if (hreq->upgrade)
+ MHD_suspend_connection (connection);
afb_hreq_free(hreq);
}
return MHD_YES;
}
-#if defined(USE_MAGIC_MIME_TYPE)
-
-#if !defined(MAGIC_DB)
-#define MAGIC_DB "/usr/share/misc/magic.mgc"
-#endif
-
-static int init_lib_magic (AFB_session *session)
-{
- /* MAGIC_MIME tells magic to return a mime of the file, but you can specify different things */
- if (verbosity)
- printf("Loading mimetype default magic database\n");
-
- session->magic = magic_open(MAGIC_MIME_TYPE);
- if (session->magic == NULL) {
- fprintf(stderr,"ERROR: unable to initialize magic library\n");
- return 0;
- }
-
- /* Warning: should not use NULL for DB [libmagic bug wont pass efence check] */
- if (magic_load(session->magic, MAGIC_DB) != 0) {
- fprintf(stderr,"cannot load magic database - %s\n", magic_error(session->magic));
- magic_close(session->magic);
- session->magic = NULL;
- return 0;
- }
-
- return 1;
-}
-#endif
-
static int my_default_init(AFB_session * session)
{
int idx;
if (!afb_hsrv_add_handler(session, session->config->rootbase, afb_hreq_one_page_api_redirect, NULL, -20))
return 0;
-#if defined(USE_MAGIC_MIME_TYPE)
- /*TBD open libmagic cache [fail to pass EFENCE check (allocating 0 bytes)] */
- init_lib_magic (session);
-#endif
-
return 1;
}