#include "afb-context.h"
#include "afb-hreq.h"
#include "afb-hsrv.h"
-#include "afb-req-itf.h"
+#include <afb/afb-req-itf.h>
#include "verbose.h"
+#include "locale-root.h"
#include "afb-common.h"
};
struct hsrv_alias {
- const char *alias;
- const char *directory;
- size_t lendir;
- int dirfd;
+ struct locale_root *root;
+ int relax;
};
struct afb_hsrv {
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;
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(
return 1;
}
-int afb_hsrv_add_alias(struct afb_hsrv *hsrv, const char *prefix, const char *alias, int priority)
+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;
}