X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-hreq.c;h=e45b25031a99cce7e9dd84ffc375a94b446f8385;hb=94014f46d4751492133f65b12f1dea1cfa36d021;hp=3f95c53293eaf1be05e92fbb82c34660c43c2f1a;hpb=8449480d29d2e03d9094ddce82557b251deb6567;p=src%2Fapp-framework-binder.git 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 #include +#include #if defined(USE_MAGIC_MIME_TYPE) #include #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);