X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fafb-hsrv.c;h=4577948350f3dccc8b1868061ddf0339fac99886;hb=540ece2baf7de59565b42d427e206769ec4da56a;hp=46e61a01efea5db2cf2d24ae2cb0c6a010fe3834;hpb=06382af9092babedbf56aa1c00b3bd7cb0b86cda;p=src%2Fapp-framework-binder.git diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c index 46e61a01..45779483 100644 --- a/src/afb-hsrv.c +++ b/src/afb-hsrv.c @@ -35,6 +35,7 @@ #include "afb-hsrv.h" #include #include "verbose.h" +#include "locale-root.h" #include "afb-common.h" @@ -54,10 +55,8 @@ struct hsrv_handler { }; struct hsrv_alias { - const char *alias; - const char *directory; - size_t lendir; - int dirfd; + struct locale_root *root; + int relax; }; struct afb_hsrv { @@ -141,6 +140,7 @@ static int access_handler( hreq->connection = connection; hreq->method = method; hreq->version = version; + hreq->lang = MHD_lookup_connection_value(connection, MHD_HEADER_KIND, MHD_HTTP_HEADER_ACCEPT_LANGUAGE); hreq->tail = hreq->url = url; hreq->lentail = hreq->lenurl = strlen(url); *recordreq = hreq; @@ -304,19 +304,26 @@ static struct hsrv_handler *new_handler( static int handle_alias(struct afb_hreq *hreq, void *data) { + int rc; struct hsrv_alias *da = data; + struct locale_search *search; if (hreq->method != afb_method_get) { + if (da->relax) + return 0; 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; + search = locale_root_search(da->root, hreq->lang, 0); + rc = afb_hreq_reply_locale_file_if_exist(hreq, search, &hreq->tail[1]); + locale_search_unref(search); + if (rc == 0) { + if (da->relax) + return 0; + afb_hreq_reply_error(hreq, MHD_HTTP_NOT_FOUND); } - - return afb_hreq_reply_file(hreq, da->dirfd, &hreq->tail[1]); + return 1; } int afb_hsrv_add_handler( @@ -335,30 +342,39 @@ int afb_hsrv_add_handler( return 1; } -int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority) +int afb_hsrv_add_alias_root(struct afb_hsrv *hsrv, const char *prefix, struct locale_root *root, int priority, int relax) { 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)) + da->root = root; + da->relax = relax; + if (afb_hsrv_add_handler(hsrv, prefix, handle_alias, da, priority)) { + locale_root_addref(root); return 1; + } free(da); } - close(dirfd); return 0; } +int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority, int relax) +{ + struct locale_root *root; + int rc; + + root = locale_root_create(AT_FDCWD, alias); + if (root == NULL) { + /* TODO message */ + rc = 0; + } else { + rc = afb_hsrv_add_alias_root(hsrv, prefix, root, priority, relax); + locale_root_unref(root); + } + return rc; +} + int afb_hsrv_set_cache_timeout(struct afb_hsrv *hsrv, int duration) { int rc;