diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-01-01 23:28:19 +0100 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-01-01 23:28:19 +0100 |
commit | 58c5fd1f9a72db878e29958a4c4e1b65db5b2e07 (patch) | |
tree | 7ed618da323bd03a8fa7535867baddaf991fd32e /file.c | |
parent | 86fb2d323eea968b55805459cab497c69b3344b8 (diff) |
add preliminary cgi support, needs fixing for close handling
Diffstat (limited to 'file.c')
-rw-r--r-- | file.c | 60 |
1 files changed, 53 insertions, 7 deletions
@@ -32,6 +32,7 @@ static char _tag[128]; static LIST_HEAD(index_files); +static LIST_HEAD(dispatch_handlers); struct index_file { struct list_head list; @@ -577,7 +578,7 @@ static void uh_file_data(struct client *cl, struct path_info *pi, int fd) file_write_cb(cl); } -static void uh_file_request(struct client *cl, struct path_info *pi, const char *url) +static void uh_file_request(struct client *cl, const char *url, struct path_info *pi) { static const struct blobmsg_policy hdr_policy[__HDR_MAX] = { [HDR_IF_MODIFIED_SINCE] = { "if-modified-since", BLOBMSG_TYPE_STRING }, @@ -611,33 +612,78 @@ static void uh_file_request(struct client *cl, struct path_info *pi, const char goto error; } + cl->dispatch.file.hdr = NULL; return; error: uh_client_error(cl, 403, "Forbidden", "You don't have permission to access %s on this server.", url); + cl->dispatch.file.hdr = NULL; +} + +void uh_dispatch_add(struct dispatch_handler *d) +{ + list_add_tail(&d->list, &dispatch_handlers); +} + +static struct dispatch_handler * +dispatch_find(const char *url, struct path_info *pi) +{ + struct dispatch_handler *d; + + list_for_each_entry(d, &dispatch_handlers, list) { + if (pi) { + if (d->check_url) + continue; + + if (d->check_path(pi, url)) + return d; + } else { + if (d->check_path) + continue; + + if (d->check_url(url)) + return d; + } + } + + return NULL; } static bool __handle_file_request(struct client *cl, const char *url) { + struct dispatch_handler *d; struct path_info *pi; pi = uh_path_lookup(cl, url); if (!pi) return false; - if (!pi->redirected) { - uh_file_request(cl, pi, url); - cl->dispatch.file.hdr = NULL; - } + if (pi->redirected) + return true; + + d = dispatch_find(url, pi); + if (d) + d->handle_request(cl, url, pi); + else + uh_file_request(cl, url, pi); return true; } -void uh_handle_file_request(struct client *cl) +void uh_handle_request(struct client *cl) { - if (__handle_file_request(cl, cl->request.url) || + struct dispatch_handler *d; + const char *url = cl->request.url; + + d = dispatch_find(url, NULL); + if (d) { + d->handle_request(cl, url, NULL); + return; + } + + if (__handle_file_request(cl, url) || __handle_file_request(cl, conf.error_handler)) return; |