Browse Source

file: add support for disabling cache related precondition checks via handlers

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Felix Fietkau 7 years ago
parent
commit
9d9f07142b
3 changed files with 16 additions and 5 deletions
  1. 6 5
      file.c
  2. 9 0
      handler.c
  3. 1 0
      uhttpd.h

+ 6 - 5
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);

+ 9 - 0
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;
 

+ 1 - 0
uhttpd.h

@@ -224,6 +224,7 @@ struct dispatch {
 	void (*req_free)(struct client *cl);
 
 	bool data_blocked;
+	bool no_cache;
 
 	union {
 		struct {