uhttpd: add support for adding arbitrary headers via handler scripts
[project/uhttpd.git] / file.c
diff --git a/file.c b/file.c
index 009acbd9aca217ed6c0f6810344567432c0f55e4..e801a9ecc29286405944641169bed1ec78fb77ff 100644 (file)
--- a/file.c
+++ b/file.c
@@ -127,7 +127,7 @@ next:
 /* Returns NULL on error.
 ** NB: improperly encoded URL should give client 400 [Bad Syntax]; returning
 ** NULL here causes 404 [Not Found], but that's not too unreasonable. */
-static struct path_info *
+struct path_info *
 uh_path_lookup(struct client *cl, const char *url)
 {
        static char path_phys[PATH_MAX];
@@ -235,7 +235,8 @@ uh_path_lookup(struct client *cl, const char *url)
           url with trailing slash appended */
        if (!slash) {
                uh_http_header(cl, 302, "Found");
-               ustream_printf(cl->us, "Content-Length: 0\r\n");
+               if (!uh_use_chunked(cl))
+                       ustream_printf(cl->us, "Content-Length: 0\r\n");
                ustream_printf(cl->us, "Location: %s%s%s\r\n\r\n",
                                &path_phys[docroot_len],
                                p.query ? "?" : "",
@@ -862,8 +863,13 @@ void uh_handle_request(struct client *cl)
        char *url = blobmsg_data(blob_data(cl->hdr.head));
        char *error_handler;
 
+       blob_buf_init(&cl->hdr_response, 0);
        url = uh_handle_alias(url);
 
+       uh_handler_run(cl, &url, false);
+       if (!url)
+               return;
+
        req->redirect_status = 200;
        d = dispatch_find(url, NULL);
        if (d)
@@ -872,6 +878,10 @@ void uh_handle_request(struct client *cl)
        if (__handle_file_request(cl, url))
                return;
 
+       if (uh_handler_run(cl, &url, true) &&
+           (!url || __handle_file_request(cl, url)))
+               return;
+
        req->redirect_status = 404;
        if (conf.error_handler) {
                error_handler = alloca(strlen(conf.error_handler) + 1);