aboutsummaryrefslogtreecommitdiffstats
path: root/src/afb-hsrv.c
diff options
context:
space:
mode:
authorJosé Bollo <jose.bollo@iot.bzh>2016-08-25 23:51:00 +0200
committerJosé Bollo <jose.bollo@iot.bzh>2016-08-25 23:54:21 +0200
commit9c4961a0e68458061171aef5f3b30a9b1fa8e333 (patch)
treeac0428ddf608aff18e0534e66c6ae64cf6333f00 /src/afb-hsrv.c
parent677813c6a26eca5629ef8201fd0616511400a99e (diff)
enforce locale processing for files
Change-Id: I7de05d2acd02d088a3a2034ad8bccf524b5b6c12 Signed-off-by: José Bollo <jose.bollo@iot.bzh>
Diffstat (limited to 'src/afb-hsrv.c')
-rw-r--r--src/afb-hsrv.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/src/afb-hsrv.c b/src/afb-hsrv.c
index 9d838381..15b2a5f2 100644
--- a/src/afb-hsrv.c
+++ b/src/afb-hsrv.c
@@ -35,6 +35,7 @@
#include "afb-hsrv.h"
#include <afb/afb-req-itf.h>
#include "verbose.h"
+#include "locale-root.h"
#include "afb-common.h"
@@ -54,10 +55,7 @@ struct hsrv_handler {
};
struct hsrv_alias {
- const char *alias;
- const char *directory;
- size_t lendir;
- int dirfd;
+ struct locale_root *root;
int relax;
};
@@ -142,7 +140,7 @@ static int access_handler(
hreq->connection = connection;
hreq->method = method;
hreq->version = version;
- hreq->lang = afb_hreq_get_header(hreq, MHD_HTTP_HEADER_ACCEPT_LANGUAGE);
+ 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;
@@ -308,6 +306,7 @@ 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)
@@ -316,14 +315,9 @@ static int handle_alias(struct afb_hreq *hreq, void *data)
return 1;
}
- if (!afb_hreq_valid_tail(hreq)) {
- if (da->relax)
- return 0;
- afb_hreq_reply_error(hreq, MHD_HTTP_FORBIDDEN);
- return 1;
- }
-
- rc = afb_hreq_reply_file_if_exist(hreq, da->dirfd, &hreq->tail[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;
@@ -350,26 +344,23 @@ int afb_hsrv_add_handler(
int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority, int relax)
{
+ struct locale_root *root;
struct hsrv_alias *da;
- int dirfd;
- dirfd = open(alias, O_PATH|O_DIRECTORY);
- if (dirfd < 0) {
+ root = locale_root_create(AT_FDCWD, alias);
+ if (root == NULL) {
/* 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;
+ da->root = root;
da->relax = relax;
if (afb_hsrv_add_handler(hsrv, prefix, handle_alias, da, priority))
return 1;
free(da);
}
- close(dirfd);
+ locale_root_unref(root);
return 0;
}