summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@nbd.name>2016-06-16 18:29:59 +0200
committerFelix Fietkau <nbd@nbd.name>2016-06-16 18:29:59 +0200
commit9d9f07142bbef1c63a79620967a847a9493105e5 (patch)
tree24eef6d2f4b4d15c2a3f6c580cde9d115e0f4815
parent242401f544df790b1df7d12b3be5f5b429da091c (diff)
file: add support for disabling cache related precondition checks via handlers
Signed-off-by: Felix Fietkau <nbd@nbd.name>
-rw-r--r--file.c11
-rw-r--r--handler.c9
-rw-r--r--uhttpd.h1
3 files changed, 16 insertions, 5 deletions
diff --git a/file.c b/file.c
index e801a9e..2a94818 100644
--- a/file.c
+++ b/file.c
@@ -565,11 +565,12 @@ static void uh_file_free(struct client *cl)
static void uh_file_data(struct client *cl, struct path_info *pi, int fd)
{
/* test preconditions */
- if (!uh_file_if_modified_since(cl, &pi->stat) ||
- !uh_file_if_match(cl, &pi->stat) ||
- !uh_file_if_range(cl, &pi->stat) ||
- !uh_file_if_unmodified_since(cl, &pi->stat) ||
- !uh_file_if_none_match(cl, &pi->stat)) {
+ if (!cl->dispatch.no_cache &&
+ (!uh_file_if_modified_since(cl, &pi->stat) ||
+ !uh_file_if_match(cl, &pi->stat) ||
+ !uh_file_if_range(cl, &pi->stat) ||
+ !uh_file_if_unmodified_since(cl, &pi->stat) ||
+ !uh_file_if_none_match(cl, &pi->stat))) {
ustream_printf(cl->us, "\r\n");
uh_request_done(cl);
close(fd);
diff --git a/handler.c b/handler.c
index 0279a6c..04e71e0 100644
--- a/handler.c
+++ b/handler.c
@@ -121,6 +121,14 @@ handle_add_header(struct json_script_ctx *ctx, struct blob_attr *data)
}
static void
+handle_no_cache(struct json_script_ctx *ctx, struct blob_attr *data)
+{
+ struct client *cl = cur_client;
+
+ cl->dispatch.no_cache = true;
+}
+
+static void
handle_command(struct json_script_ctx *ctx, const char *name,
struct blob_attr *data, struct blob_attr *vars)
{
@@ -131,6 +139,7 @@ handle_command(struct json_script_ctx *ctx, const char *name,
{ "redirect", handle_redirect },
{ "rewrite", handle_set_uri },
{ "add-header", handle_add_header },
+ { "no-cache", handle_no_cache },
};
int i;
diff --git a/uhttpd.h b/uhttpd.h
index b022ecf..fe05f0d 100644
--- a/uhttpd.h
+++ b/uhttpd.h
@@ -224,6 +224,7 @@ struct dispatch {
void (*req_free)(struct client *cl);
bool data_blocked;
+ bool no_cache;
union {
struct {