From: Felix Fietkau Date: Thu, 16 Jun 2016 16:29:59 +0000 (+0200) Subject: file: add support for disabling cache related precondition checks via handlers X-Git-Url: http://git.openwrt.org/?p=project%2Fuhttpd.git;a=commitdiff_plain;h=9d9f07142bbef1c63a79620967a847a9493105e5;ds=sidebyside file: add support for disabling cache related precondition checks via handlers Signed-off-by: Felix Fietkau --- 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 @@ -120,6 +120,14 @@ handle_add_header(struct json_script_ctx *ctx, struct blob_attr *data) blobmsg_get_string(tb[1])); } +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 {