|  | @@ -2657,9 +2657,18 @@ static int base64_decode(const unsigned char *src, int src_len, char *dst, size_
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +static int is_put_or_delete_method(const struct mg_connection *conn)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    const char *s = conn->request_info.request_method;
 | 
	
		
			
				|  |  | +    return s != NULL && (!strcmp(s, "PUT") ||
 | 
	
		
			
				|  |  | +                         !strcmp(s, "DELETE") ||
 | 
	
		
			
				|  |  | +                         !strcmp(s, "MKCOL"));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
 | 
	
		
			
				|  |  |                                       size_t buf_len, struct file *filep,
 | 
	
		
			
				|  |  | -                                     int * is_script_ressource, int * is_websocket_request)
 | 
	
		
			
				|  |  | +                                     int * is_script_ressource, int * is_websocket_request,
 | 
	
		
			
				|  |  | +                                     int * is_put_or_delete_request)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      struct vec a, b;
 | 
	
		
			
				|  |  |      const char *rewrite, *uri = conn->request_info.uri,
 | 
	
	
		
			
				|  | @@ -2670,12 +2679,15 @@ static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
 | 
	
		
			
				|  |  |      char const* accept_encoding;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      *is_script_ressource = 0;
 | 
	
		
			
				|  |  | -    *is_websocket_request = is_websocket_protocol(conn);
 | 
	
		
			
				|  |  | +    *is_put_or_delete_request = is_put_or_delete_method(conn);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  #if defined(USE_WEBSOCKET)
 | 
	
		
			
				|  |  | +    *is_websocket_request = is_websocket_protocol(conn);
 | 
	
		
			
				|  |  |      if (*is_websocket_request && conn->ctx->config[WEBSOCKET_ROOT]) {
 | 
	
		
			
				|  |  |          root = conn->ctx->config[WEBSOCKET_ROOT];
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +    *is_websocket_request = 0;
 | 
	
		
			
				|  |  |  #endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      /* Using buf_len - 1 because memmove() for PATH_INFO may shift part
 | 
	
	
		
			
				|  | @@ -5573,14 +5585,6 @@ int mg_upload(struct mg_connection *conn, const char *destination_dir)
 | 
	
		
			
				|  |  |      return num_uploaded_files;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static int is_put_or_delete_request(const struct mg_connection *conn)
 | 
	
		
			
				|  |  | -{
 | 
	
		
			
				|  |  | -    const char *s = conn->request_info.request_method;
 | 
	
		
			
				|  |  | -    return s != NULL && (!strcmp(s, "PUT") ||
 | 
	
		
			
				|  |  | -                         !strcmp(s, "DELETE") ||
 | 
	
		
			
				|  |  | -                         !strcmp(s, "MKCOL"));
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  static int get_first_ssl_listener_index(const struct mg_context *ctx)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      int i, idx = -1;
 | 
	
	
		
			
				|  | @@ -5725,7 +5729,7 @@ static void handle_request(struct mg_connection *conn)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      struct mg_request_info *ri = &conn->request_info;
 | 
	
		
			
				|  |  |      char path[PATH_MAX];
 | 
	
		
			
				|  |  | -    int uri_len, ssl_index, is_script_resource, is_websocket_request;
 | 
	
		
			
				|  |  | +    int uri_len, ssl_index, is_script_resource, is_websocket_request, is_put_or_delete_request;
 | 
	
		
			
				|  |  |      struct file file = STRUCT_FILE_INITIALIZER;
 | 
	
		
			
				|  |  |      char date[64];
 | 
	
		
			
				|  |  |      time_t curtime = time(NULL);
 | 
	
	
		
			
				|  | @@ -5740,7 +5744,7 @@ static void handle_request(struct mg_connection *conn)
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      remove_double_dots_and_double_slashes((char *) ri->uri);
 | 
	
		
			
				|  |  |      path[0] = '\0';
 | 
	
		
			
				|  |  | -    convert_uri_to_file_name(conn, path, sizeof(path), &file, &is_script_resource, &is_websocket_request);
 | 
	
		
			
				|  |  | +    convert_uri_to_file_name(conn, path, sizeof(path), &file, &is_script_resource, &is_websocket_request, &is_put_or_delete_request);
 | 
	
		
			
				|  |  |      conn->throttle = set_throttle(conn->ctx->config[THROTTLE],
 | 
	
		
			
				|  |  |                                    get_remote_ip(conn), ri->uri);
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -5751,7 +5755,7 @@ static void handle_request(struct mg_connection *conn)
 | 
	
		
			
				|  |  |      if (!conn->client.is_ssl && conn->client.ssl_redir &&
 | 
	
		
			
				|  |  |          (ssl_index = get_first_ssl_listener_index(conn->ctx)) > -1) {
 | 
	
		
			
				|  |  |          redirect_to_https_port(conn, ssl_index);
 | 
	
		
			
				|  |  | -    } else if (!is_script_resource && !is_put_or_delete_request(conn) &&
 | 
	
		
			
				|  |  | +    } else if (!is_script_resource && !is_put_or_delete_request &&
 | 
	
		
			
				|  |  |                 !check_authorization(conn, path)) {
 | 
	
		
			
				|  |  |          send_authorization_request(conn);
 | 
	
		
			
				|  |  |      } else if (conn->ctx->callbacks.begin_request != NULL &&
 | 
	
	
		
			
				|  | @@ -5770,7 +5774,7 @@ static void handle_request(struct mg_connection *conn)
 | 
	
		
			
				|  |  |          send_options(conn);
 | 
	
		
			
				|  |  |      } else if (conn->ctx->config[DOCUMENT_ROOT] == NULL) {
 | 
	
		
			
				|  |  |          send_http_error(conn, 404, "Not Found", "Not Found");
 | 
	
		
			
				|  |  | -    } else if (!is_script_resource && is_put_or_delete_request(conn) &&
 | 
	
		
			
				|  |  | +    } else if (!is_script_resource && is_put_or_delete_request &&
 | 
	
		
			
				|  |  |                 (is_authorized_for_put(conn) != 1)) {
 | 
	
		
			
				|  |  |          send_authorization_request(conn);
 | 
	
		
			
				|  |  |      } else if (!is_script_resource && !strcmp(ri->request_method, "PUT")) {
 |