summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/afb-apis.c2
-rw-r--r--src/afb-hreq.c66
-rw-r--r--src/afb-hreq.h9
-rw-r--r--src/afb-hsrv.c340
-rw-r--r--src/afb-hsrv.h11
-rw-r--r--src/afb-websock.c2
-rw-r--r--src/afb-websock.h7
-rw-r--r--src/local-def.h2
-rw-r--r--src/main.c135
9 files changed, 289 insertions, 285 deletions
diff --git a/src/afb-apis.c b/src/afb-apis.c
index 9b2df3f3..7d0feb39 100644
--- a/src/afb-apis.c
+++ b/src/afb-apis.c
@@ -37,8 +37,6 @@
#include <sys/syscall.h>
#include <setjmp.h>
-#include "local-def.h"
-
#include "afb-plugin.h"
#include "afb-req-itf.h"
#include "afb-poll-itf.h"
diff --git a/src/afb-hreq.c b/src/afb-hreq.c
index 3f95c532..e45b2503 100644
--- a/src/afb-hreq.c
+++ b/src/afb-hreq.c
@@ -27,13 +27,15 @@
#include <sys/stat.h>
#include <microhttpd.h>
+#include <json.h>
#if defined(USE_MAGIC_MIME_TYPE)
#include <magic.h>
#endif
-#include "local-def.h"
#include "afb-method.h"
+#include "afb-websock.h"
+#include "afb-apis.h"
#include "afb-req-itf.h"
#include "afb-hreq.h"
#include "session.h"
@@ -408,6 +410,68 @@ int afb_hreq_redirect_to(struct afb_hreq *hreq, const char *url)
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);
+}
+
+int afb_hreq_websocket_switch(struct afb_hreq *hreq, void *data)
+{
+ int later;
+
+ afb_hreq_context(hreq);
+ if (hreq->lentail != 0 || !afb_websock_check(hreq, &later))
+ return 0;
+
+ if (!later) {
+ struct afb_websock *ws = afb_websock_create(hreq);
+ if (ws != NULL)
+ hreq->upgrade = 1;
+ }
+ return 1;
+}
+
+int afb_hreq_rest_api(struct afb_hreq *hreq, void *data)
+{
+ const char *api, *verb;
+ size_t lenapi, lenverb;
+ struct AFB_clientCtx *context;
+
+ api = &hreq->tail[strspn(hreq->tail, "/")];
+ lenapi = strcspn(api, "/");
+ verb = &api[lenapi];
+ verb = &verb[strspn(verb, "/")];
+ lenverb = strcspn(verb, "/");
+
+ if (!(*api && *verb && lenapi && lenverb))
+ return 0;
+
+ context = afb_hreq_context(hreq);
+ return afb_apis_handle(afb_hreq_to_req(hreq), context, api, lenapi, verb, lenverb);
+}
+
const char *afb_hreq_get_cookie(struct afb_hreq *hreq, const char *name)
{
return MHD_lookup_connection_value(hreq->connection, MHD_COOKIE_KIND, name);
diff --git a/src/afb-hreq.h b/src/afb-hreq.h
index 752d06ce..8fbc5634 100644
--- a/src/afb-hreq.h
+++ b/src/afb-hreq.h
@@ -21,7 +21,7 @@ struct AFB_clientCtx;
struct afb_hreq {
const char *cacheTimeout;
struct MHD_Connection *connection;
- enum afb_method method;
+ int method;
const char *version;
const char *url;
size_t lenurl;
@@ -60,3 +60,10 @@ extern int afb_hreq_post_add(struct afb_hreq *hreq, const char *name, const char
extern struct afb_req afb_hreq_to_req(struct afb_hreq *hreq);
extern struct AFB_clientCtx *afb_hreq_context(struct afb_hreq *hreq);
+
+extern int afb_hreq_one_page_api_redirect(struct afb_hreq *hreq, void *data);
+
+extern int afb_hreq_websocket_switch(struct afb_hreq *hreq, void *data);
+
+extern int afb_hreq_rest_api(struct afb_hreq *hreq, void *data);
+
diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c
index 61366552..efbb9356 100644
--- a/src/afb-hsrv.c
+++ b/src/afb-hsrv.c
@@ -26,22 +26,20 @@
#include <microhttpd.h>
-#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"
#include "verbose.h"
#include "utils-upoll.h"
+
#define JSON_CONTENT "application/json"
#define FORM_CONTENT MHD_HTTP_POST_ENCODING_MULTIPART_FORMDATA
-struct afb_hsrv_handler {
- struct afb_hsrv_handler *next;
+struct hsrv_handler {
+ struct hsrv_handler *next;
const char *prefix;
size_t length;
int (*handler) (struct afb_hreq *, void *);
@@ -49,7 +47,7 @@ struct afb_hsrv_handler {
int priority;
};
-struct afb_diralias {
+struct hsrv_alias {
const char *alias;
const char *directory;
size_t lendir;
@@ -58,174 +56,13 @@ struct afb_diralias {
struct afb_hsrv {
unsigned refcount;
- struct afb_hsrv_handler *handlers;
+ struct hsrv_handler *handlers;
struct MHD_Daemon *httpd;
struct upoll *upoll;
char *cache_to;
};
-
-static struct afb_hsrv_handler *new_handler(
- struct afb_hsrv_handler *head,
- const char *prefix,
- int (*handler) (struct afb_hreq *, void *),
- void *data,
- int priority)
-{
- struct afb_hsrv_handler *link, *iter, *previous;
- size_t length;
-
- /* get the length of the prefix without its leading / */
- length = strlen(prefix);
- while (length && prefix[length - 1] == '/')
- length--;
-
- /* allocates the new link */
- link = malloc(sizeof *link);
- if (link == NULL)
- return NULL;
-
- /* initialize it */
- link->prefix = prefix;
- link->length = length;
- link->handler = handler;
- link->data = data;
- link->priority = priority;
-
- /* adds it */
- previous = NULL;
- iter = head;
- while (iter && (priority < iter->priority || (priority == iter->priority && length <= iter->length))) {
- previous = iter;
- iter = iter->next;
- }
- link->next = iter;
- if (previous == NULL)
- return link;
- previous->next = link;
- return head;
-}
-
-int afb_hsrv_add_handler(
- struct afb_hsrv *hsrv,
- const char *prefix,
- int (*handler) (struct afb_hreq *, void *),
- void *data,
- int priority)
-{
- struct afb_hsrv_handler *head;
-
- head = new_handler(hsrv->handlers, prefix, handler, data, priority);
- if (head == NULL)
- return 0;
- hsrv->handlers = 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;
-
- afb_hreq_context(hreq);
- if (hreq->lentail != 0 || !afb_websock_check(hreq, &later))
- return 0;
-
- if (!later) {
- struct afb_websock *ws = afb_websock_create(hreq);
- if (ws != NULL)
- hreq->upgrade = 1;
- }
- return 1;
-}
-
-static int afb_hreq_rest_api(struct afb_hreq *hreq, void *data)
-{
- const char *api, *verb;
- size_t lenapi, lenverb;
- struct AFB_clientCtx *context;
-
- api = &hreq->tail[strspn(hreq->tail, "/")];
- lenapi = strcspn(api, "/");
- verb = &api[lenapi];
- verb = &verb[strspn(verb, "/")];
- lenverb = strcspn(verb, "/");
-
- if (!(*api && *verb && lenapi && lenverb))
- return 0;
-
- context = afb_hreq_context(hreq);
- return afb_apis_handle(afb_hreq_to_req(hreq), context, api, lenapi, verb, lenverb);
-}
-
-static int handle_alias(struct afb_hreq *hreq, void *data)
-{
- struct afb_diralias *da = data;
-
- if (hreq->method != afb_method_get) {
- afb_hreq_reply_error(hreq, MHD_HTTP_METHOD_NOT_ALLOWED);
- return 1;
- }
-
- if (!afb_hreq_valid_tail(hreq)) {
- afb_hreq_reply_error(hreq, MHD_HTTP_FORBIDDEN);
- return 1;
- }
-
- return afb_hreq_reply_file(hreq, da->dirfd, &hreq->tail[1]);
-}
-
-int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority)
-{
- struct afb_diralias *da;
- int dirfd;
-
- dirfd = open(alias, O_PATH|O_DIRECTORY);
- if (dirfd < 0) {
- /* TODO message */
- return 0;
- }
- da = malloc(sizeof *da);
- if (da != NULL) {
- da->alias = prefix;
- da->directory = alias;
- da->lendir = strlen(da->directory);
- da->dirfd = dirfd;
- if (afb_hsrv_add_handler(hsrv, prefix, handle_alias, da, priority))
- return 1;
- free(da);
- }
- close(dirfd);
- return 0;
-}
-
static void reply_error(struct MHD_Connection *connection, unsigned int status)
{
char *buffer;
@@ -275,7 +112,7 @@ static int access_handler(
struct afb_hreq *hreq;
enum afb_method method;
struct afb_hsrv *hsrv;
- struct afb_hsrv_handler *iter;
+ struct hsrv_handler *iter;
const char *type;
hsrv = cls;
@@ -382,10 +219,102 @@ static int new_client_handler(void *cls, const struct sockaddr *addr, socklen_t
return MHD_YES;
}
-/* infinite loop */
-static void hsrv_handle_event(struct MHD_Daemon *httpd)
+static struct hsrv_handler *new_handler(
+ struct hsrv_handler *head,
+ const char *prefix,
+ int (*handler) (struct afb_hreq *, void *),
+ void *data,
+ int priority)
{
- MHD_run(httpd);
+ struct hsrv_handler *link, *iter, *previous;
+ size_t length;
+
+ /* get the length of the prefix without its leading / */
+ length = strlen(prefix);
+ while (length && prefix[length - 1] == '/')
+ length--;
+
+ /* allocates the new link */
+ link = malloc(sizeof *link);
+ if (link == NULL)
+ return NULL;
+
+ /* initialize it */
+ link->prefix = prefix;
+ link->length = length;
+ link->handler = handler;
+ link->data = data;
+ link->priority = priority;
+
+ /* adds it */
+ previous = NULL;
+ iter = head;
+ while (iter && (priority < iter->priority || (priority == iter->priority && length <= iter->length))) {
+ previous = iter;
+ iter = iter->next;
+ }
+ link->next = iter;
+ if (previous == NULL)
+ return link;
+ previous->next = link;
+ return head;
+}
+
+static int handle_alias(struct afb_hreq *hreq, void *data)
+{
+ struct hsrv_alias *da = data;
+
+ if (hreq->method != afb_method_get) {
+ afb_hreq_reply_error(hreq, MHD_HTTP_METHOD_NOT_ALLOWED);
+ return 1;
+ }
+
+ if (!afb_hreq_valid_tail(hreq)) {
+ afb_hreq_reply_error(hreq, MHD_HTTP_FORBIDDEN);
+ return 1;
+ }
+
+ return afb_hreq_reply_file(hreq, da->dirfd, &hreq->tail[1]);
+}
+
+int afb_hsrv_add_handler(
+ struct afb_hsrv *hsrv,
+ const char *prefix,
+ int (*handler) (struct afb_hreq *, void *),
+ void *data,
+ int priority)
+{
+ struct hsrv_handler *head;
+
+ head = new_handler(hsrv->handlers, prefix, handler, data, priority);
+ if (head == NULL)
+ return 0;
+ hsrv->handlers = head;
+ return 1;
+}
+
+int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority)
+{
+ struct hsrv_alias *da;
+ int dirfd;
+
+ dirfd = open(alias, O_PATH|O_DIRECTORY);
+ if (dirfd < 0) {
+ /* TODO message */
+ return 0;
+ }
+ da = malloc(sizeof *da);
+ if (da != NULL) {
+ da->alias = prefix;
+ da->directory = alias;
+ da->lendir = strlen(da->directory);
+ da->dirfd = dirfd;
+ if (afb_hsrv_add_handler(hsrv, prefix, handle_alias, da, priority))
+ return 1;
+ free(da);
+ }
+ close(dirfd);
+ return 0;
}
int afb_hsrv_set_cache_timeout(struct afb_hsrv *hsrv, int duration)
@@ -402,7 +331,7 @@ int afb_hsrv_set_cache_timeout(struct afb_hsrv *hsrv, int duration)
return 1;
}
-int _afb_hsrv_start(struct afb_hsrv *hsrv, uint16_t port, unsigned int connection_timeout)
+int afb_hsrv_start(struct afb_hsrv *hsrv, uint16_t port, unsigned int connection_timeout)
{
struct upoll *upoll;
struct MHD_Daemon *httpd;
@@ -435,14 +364,14 @@ int _afb_hsrv_start(struct afb_hsrv *hsrv, uint16_t port, unsigned int connectio
fprintf(stderr, "Error: connection to upoll of httpd failed");
return 0;
}
- upoll_on_readable(upoll, (void*)hsrv_handle_event);
+ upoll_on_readable(upoll, (void*)MHD_run);
hsrv->httpd = httpd;
hsrv->upoll = upoll;
return 1;
}
-void _afb_hsrv_stop(struct afb_hsrv *hsrv)
+void afb_hsrv_stop(struct afb_hsrv *hsrv)
{
if (hsrv->upoll)
upoll_close(hsrv->upoll);
@@ -464,67 +393,8 @@ void afb_hsrv_put(struct afb_hsrv *hsrv)
{
assert(hsrv->refcount != 0);
if (!--hsrv->refcount) {
- _afb_hsrv_stop(hsrv);
+ afb_hsrv_stop(hsrv);
free(hsrv);
}
}
-static int my_default_init(struct afb_hsrv *hsrv, AFB_session * session)
-{
- int idx;
-
- if (!afb_hsrv_add_handler(hsrv, session->config->rootapi, afb_hreq_websocket_switch, NULL, 20))
- return 0;
-
- if (!afb_hsrv_add_handler(hsrv, session->config->rootapi, afb_hreq_rest_api, NULL, 10))
- return 0;
-
- for (idx = 0; session->config->aliasdir[idx].url != NULL; idx++)
- if (!afb_hsrv_add_alias (hsrv, session->config->aliasdir[idx].url, session->config->aliasdir[idx].path, 0))
- return 0;
-
- if (!afb_hsrv_add_alias(hsrv, "", session->config->rootdir, -10))
- return 0;
-
- if (!afb_hsrv_add_handler(hsrv, session->config->rootbase, afb_hreq_one_page_api_redirect, NULL, -20))
- return 0;
-
- return 1;
-}
-
-int afb_hsrv_start(AFB_session * session)
-{
- int rc;
- struct afb_hsrv *hsrv;
-
- hsrv = afb_hsrv_create();
- if (hsrv == NULL) {
- fprintf(stderr, "memory allocation failure\n");
- return 0;
- }
-
- if (!afb_hsrv_set_cache_timeout(hsrv, session->config->cacheTimeout)
- || !my_default_init(hsrv, session)) {
- printf("Error: initialisation of httpd failed");
- afb_hsrv_put(hsrv);
- return 0;
- }
-
- if (verbosity) {
- printf("AFB:notice Waiting port=%d rootdir=%s\n", session->config->httpdPort, session->config->rootdir);
- printf("AFB:notice Browser URL= http:/*localhost:%d\n", session->config->httpdPort);
- }
-
- rc = _afb_hsrv_start(hsrv, (uint16_t) session->config->httpdPort, 15);
- if (!rc)
- return 0;
-
- session->hsrv = hsrv;
- return 1;
-}
-
-void afb_hsrv_stop(AFB_session * session)
-{
- _afb_hsrv_stop(session->hsrv);
-}
-
diff --git a/src/afb-hsrv.h b/src/afb-hsrv.h
index 93b845c1..c22f57ee 100644
--- a/src/afb-hsrv.h
+++ b/src/afb-hsrv.h
@@ -17,8 +17,15 @@
*/
struct afb_hsrv;
+struct afb_hreq;
extern struct afb_hsrv *afb_hsrv_create();
+extern void afb_hsrv_put(struct afb_hsrv *hsrv);
+
+
+extern void afb_hsrv_stop(struct afb_hsrv *hsrv);
+extern int afb_hsrv_start(struct afb_hsrv *hsrv, uint16_t port, unsigned int connection_timeout);
+extern int afb_hsrv_set_cache_timeout(struct afb_hsrv *hsrv, int duration);
+extern int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority);
+extern int afb_hsrv_add_handler(struct afb_hsrv *hsrv, const char *prefix, int (*handler) (struct afb_hreq *, void *), void *data, int priority);
-extern int afb_hsrv_start(AFB_session * session);
-extern void afb_hsrv_stop(AFB_session * session);
diff --git a/src/afb-websock.c b/src/afb-websock.c
index 1292d1f1..e8f596c7 100644
--- a/src/afb-websock.c
+++ b/src/afb-websock.c
@@ -30,8 +30,6 @@
#include "websock.h"
-#include "local-def.h"
-
#include "afb-req-itf.h"
#include "afb-method.h"
#include "afb-hreq.h"
diff --git a/src/afb-websock.h b/src/afb-websock.h
index be349563..4f7ea912 100644
--- a/src/afb-websock.h
+++ b/src/afb-websock.h
@@ -15,7 +15,10 @@
* limitations under the License.
*/
-int afb_websock_check(struct afb_hreq *hreq, int *later);
-struct afb_websock *afb_websock_create(struct afb_hreq *hreq);
+struct afb_hreq;
+struct afb_websock;
+
+extern int afb_websock_check(struct afb_hreq *hreq, int *later);
+extern struct afb_websock *afb_websock_create(struct afb_hreq *hreq);
diff --git a/src/local-def.h b/src/local-def.h
index 1992b510..99502058 100644
--- a/src/local-def.h
+++ b/src/local-def.h
@@ -64,7 +64,6 @@ struct AFB_config
};
struct afb_hsrv;
-struct afb_hsrv_handler;
struct MHD_Daemon;
struct AFB_session
@@ -73,7 +72,6 @@ struct AFB_session
// List of commands to execute
int background; // run in backround mode
int readyfd; // a #fd to signal when ready to serve
- struct afb_hsrv *hsrv;
};
diff --git a/src/main.c b/src/main.c
index aa4b84c3..b0261a44 100644
--- a/src/main.c
+++ b/src/main.c
@@ -32,6 +32,7 @@
#include "local-def.h"
#include "afb-apis.h"
#include "afb-hsrv.h"
+#include "afb-hreq.h"
#include "session.h"
#include "verbose.h"
#include "utils-upoll.h"
@@ -67,6 +68,8 @@
#define SET_MODE 18
#define SET_READYFD 19
+static struct afb_hsrv *start(AFB_config * config);
+
// Command line structure hold cli --command + help text
typedef struct {
int val; // command number within application
@@ -126,61 +129,61 @@ static void printVersion (void)
}
// load config from disk and merge with CLI option
-static void config_set_default (AFB_session * session)
+static void config_set_default (AFB_config * config)
{
// default HTTP port
- if (session->config->httpdPort == 0)
- session->config->httpdPort = 1234;
+ if (config->httpdPort == 0)
+ config->httpdPort = 1234;
// default Plugin API timeout
- if (session->config->apiTimeout == 0)
- session->config->apiTimeout = DEFLT_API_TIMEOUT;
+ if (config->apiTimeout == 0)
+ config->apiTimeout = DEFLT_API_TIMEOUT;
// default AUTH_TOKEN
- if (session->config->token == NULL)
- session->config->token = DEFLT_AUTH_TOKEN;
+ if (config->token == NULL)
+ config->token = DEFLT_AUTH_TOKEN;
// cache timeout default one hour
- if (session->config->cacheTimeout == 0)
- session->config->cacheTimeout = DEFLT_CACHE_TIMEOUT;
+ if (config->cacheTimeout == 0)
+ config->cacheTimeout = DEFLT_CACHE_TIMEOUT;
// cache timeout default one hour
- if (session->config->cntxTimeout == 0)
- session->config->cntxTimeout = DEFLT_CNTX_TIMEOUT;
-
- if (session->config->rootdir == NULL) {
- session->config->rootdir = getenv("AFBDIR");
- if (session->config->rootdir == NULL) {
- session->config->rootdir = malloc (512);
- strncpy (session->config->rootdir, getenv("HOME"),512);
- strncat (session->config->rootdir, "/.AFB",512);
+ if (config->cntxTimeout == 0)
+ config->cntxTimeout = DEFLT_CNTX_TIMEOUT;
+
+ if (config->rootdir == NULL) {
+ config->rootdir = getenv("AFBDIR");
+ if (config->rootdir == NULL) {
+ config->rootdir = malloc (512);
+ strncpy (config->rootdir, getenv("HOME"),512);
+ strncat (config->rootdir, "/.AFB",512);
}
// if directory does not exist createit
- mkdir (session->config->rootdir, O_RDWR | S_IRWXU | S_IRGRP);
+ mkdir (config->rootdir, O_RDWR | S_IRWXU | S_IRGRP);
}
// if no Angular/HTML5 rootbase let's try '/' as default
- if (session->config->rootbase == NULL)
- session->config->rootbase = "/opa";
+ if (config->rootbase == NULL)
+ config->rootbase = "/opa";
- if (session->config->rootapi == NULL)
- session->config->rootapi = "/api";
+ if (config->rootapi == NULL)
+ config->rootapi = "/api";
- if (session->config->ldpaths == NULL)
- session->config->ldpaths = PLUGIN_INSTALL_DIR;
+ if (config->ldpaths == NULL)
+ config->ldpaths = PLUGIN_INSTALL_DIR;
// if no session dir create a default path from rootdir
- if (session->config->sessiondir == NULL) {
- session->config->sessiondir = malloc (512);
- strncpy (session->config->sessiondir, session->config->rootdir, 512);
- strncat (session->config->sessiondir, "/sessions",512);
+ if (config->sessiondir == NULL) {
+ config->sessiondir = malloc (512);
+ strncpy (config->sessiondir, config->rootdir, 512);
+ strncat (config->sessiondir, "/sessions",512);
}
// if no config dir create a default path from sessiondir
- if (session->config->console == NULL) {
- session->config->console = malloc (512);
- strncpy (session->config->console, session->config->sessiondir, 512);
- strncat (session->config->console, "/AFB-console.out",512);
+ if (config->console == NULL) {
+ config->console = malloc (512);
+ strncpy (config->console, config->sessiondir, 512);
+ strncat (config->console, "/AFB-console.out",512);
}
}
@@ -360,7 +363,7 @@ static void parse_arguments(int argc, char *argv[], AFB_session *session)
}
free(gnuOptions);
- config_set_default (session);
+ config_set_default (session->config);
return;
@@ -490,8 +493,8 @@ static void daemonize(AFB_session *session)
+--------------------------------------------------------- */
int main(int argc, char *argv[]) {
- int rc;
AFB_session *session;
+ struct afb_hsrv *hsrv;
// open syslog if ever needed
openlog("afb-daemon", 0, LOG_DAEMON);
@@ -542,8 +545,8 @@ int main(int argc, char *argv[]) {
}
- rc = afb_hsrv_start (session);
- if (!rc)
+ hsrv = start (session->config);
+ if (hsrv == NULL)
exit(1);
if (session->readyfd != 0) {
@@ -554,7 +557,7 @@ int main(int argc, char *argv[]) {
// infinite loop
for(;;)
- upoll_wait(30000);
+ upoll_wait(30000);
if (verbosity)
fprintf (stderr, "hoops returned from infinite loop [report bug]\n");
@@ -562,4 +565,60 @@ int main(int argc, char *argv[]) {
return 0;
}
+static int init(struct afb_hsrv *hsrv, AFB_config * config)
+{
+ int idx;
+
+ if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hreq_websocket_switch, NULL, 20))
+ return 0;
+
+ if (!afb_hsrv_add_handler(hsrv, config->rootapi, afb_hreq_rest_api, NULL, 10))
+ return 0;
+
+ for (idx = 0; config->aliasdir[idx].url != NULL; idx++)
+ if (!afb_hsrv_add_alias (hsrv, config->aliasdir[idx].url, config->aliasdir[idx].path, 0))
+ return 0;
+
+ if (!afb_hsrv_add_alias(hsrv, "", config->rootdir, -10))
+ return 0;
+
+ if (!afb_hsrv_add_handler(hsrv, config->rootbase, afb_hreq_one_page_api_redirect, NULL, -20))
+ return 0;
+
+ return 1;
+}
+
+static struct afb_hsrv *start(AFB_config * config)
+{
+ int rc;
+ struct afb_hsrv *hsrv;
+
+ hsrv = afb_hsrv_create();
+ if (hsrv == NULL) {
+ fprintf(stderr, "memory allocation failure\n");
+ return NULL;
+ }
+
+ if (!afb_hsrv_set_cache_timeout(hsrv, config->cacheTimeout)
+ || !init(hsrv, config)) {
+ printf("Error: initialisation of httpd failed");
+ afb_hsrv_put(hsrv);
+ return NULL;
+ }
+
+ if (verbosity) {
+ printf("AFB:notice Waiting port=%d rootdir=%s\n", config->httpdPort, config->rootdir);
+ printf("AFB:notice Browser URL= http:/*localhost:%d\n", config->httpdPort);
+ }
+
+ rc = afb_hsrv_start(hsrv, (uint16_t) config->httpdPort, 15);
+ if (!rc) {
+ printf("Error: starting of httpd failed");
+ afb_hsrv_put(hsrv);
+ return NULL;
+ }
+
+ return hsrv;
+}
+