Forráskód Böngészése

Allow dynamic ressources managed by Lua

bel 11 éve
szülő
commit
9f2acfd90f
1 módosított fájl, 17 hozzáadás és 11 törlés
  1. 17 11
      src/civetweb.c

+ 17 - 11
src/civetweb.c

@@ -2218,7 +2218,8 @@ int mg_get_cookie(const char *cookie_header, const char *var_name,
 }
 
 static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
-                                     size_t buf_len, struct file *filep)
+                                     size_t buf_len, struct file *filep, 
+                                     int * is_script_ressource)
 {
     struct vec a, b;
     const char *rewrite, *uri = conn->request_info.uri,
@@ -2228,6 +2229,8 @@ static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
     char gz_path[PATH_MAX];
     char const* accept_encoding;
 
+    *is_script_ressource = 0;
+
     /* Using buf_len - 1 because memmove() for PATH_INFO may shift part
        of the path one byte on the right.
        If document_root is NULL, leave the file empty. */
@@ -2280,6 +2283,7 @@ static void convert_uri_to_file_name(struct mg_connection *conn, char *buf,
                 memmove(p + 2, p + 1, strlen(p + 1) + 1);  /* +1 is for
                                                               trailing \0 */
                 p[1] = '/';
+                *is_script_ressource = 1;
                 break;
             } else {
                 *p = '/';
@@ -5060,7 +5064,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;
+    int uri_len, ssl_index, is_script_resource;
     struct file file = STRUCT_FILE_INITIALIZER;
 
     if ((conn->request_info.query_string = strchr(ri->uri, '?')) != NULL) {
@@ -5070,7 +5074,7 @@ static void handle_request(struct mg_connection *conn)
     mg_url_decode(ri->uri, uri_len, (char *) ri->uri, uri_len + 1, 0);
     remove_double_dots_and_double_slashes((char *) ri->uri);
     path[0] = '\0';
-    convert_uri_to_file_name(conn, path, sizeof(path), &file);
+    convert_uri_to_file_name(conn, path, sizeof(path), &file, &is_script_resource);
     conn->throttle = set_throttle(conn->ctx->config[THROTTLE],
                                   get_remote_ip(conn), ri->uri);
 
@@ -5081,7 +5085,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_put_or_delete_request(conn) &&
+    } else if (!is_script_resource && !is_put_or_delete_request(conn) &&
                !check_authorization(conn, path)) {
         send_authorization_request(conn);
     } else if (conn->ctx->callbacks.begin_request != NULL &&
@@ -5094,18 +5098,18 @@ static void handle_request(struct mg_connection *conn)
     } else if (is_websocket_request(conn)) {
         handle_websocket_request(conn);
 #endif
-    } else if (!strcmp(ri->request_method, "OPTIONS")) {
+    } else if (!is_script_resource && !strcmp(ri->request_method, "OPTIONS")) {
         send_options(conn);
     } else if (conn->ctx->config[DOCUMENT_ROOT] == NULL) {
         send_http_error(conn, 404, "Not Found", "Not Found");
-    } else if (is_put_or_delete_request(conn) &&
+    } else if (!is_script_resource && is_put_or_delete_request(conn) &&
                (is_authorized_for_put(conn) != 1)) {
         send_authorization_request(conn);
-    } else if (!strcmp(ri->request_method, "PUT")) {
+    } else if (!is_script_resource && !strcmp(ri->request_method, "PUT")) {
         put_file(conn, path);
-    } else if (!strcmp(ri->request_method, "MKCOL")) {
+    } else if (!is_script_resource && !strcmp(ri->request_method, "MKCOL")) {
         mkcol(conn, path);
-    } else if (!strcmp(ri->request_method, "DELETE")) {
+    } else if (!is_script_resource && !strcmp(ri->request_method, "DELETE")) {
         struct de de;
         memset(&de.file, 0, sizeof(de.file));
         if(!mg_stat(conn, path, &de.file)) {
@@ -5132,7 +5136,7 @@ static void handle_request(struct mg_connection *conn)
     } else if (file.is_directory && ri->uri[uri_len - 1] != '/') {
         mg_printf(conn, "HTTP/1.1 301 Moved Permanently\r\n"
                   "Location: %s/\r\n\r\n", ri->uri);
-    } else if (!strcmp(ri->request_method, "PROPFIND")) {
+    } else if (!is_script_resource && !strcmp(ri->request_method, "PROPFIND")) {
         handle_propfind(conn, path, &file);
     } else if (file.is_directory &&
                !substitute_index_file(conn, path, sizeof(path), &file)) {
@@ -5152,6 +5156,7 @@ static void handle_request(struct mg_connection *conn)
     } else if (match_prefix(conn->ctx->config[CGI_EXTENSIONS],
                             (int)strlen(conn->ctx->config[CGI_EXTENSIONS]),
                             path) > 0) {
+        /* TODO: check unsupported methods -> 501 
         if (strcmp(ri->request_method, "POST") &&
             strcmp(ri->request_method, "HEAD") &&
             strcmp(ri->request_method, "GET")) {
@@ -5159,7 +5164,8 @@ static void handle_request(struct mg_connection *conn)
                             "Method %s is not implemented", ri->request_method);
         } else {
             handle_cgi_request(conn, path);
-        }
+        } */
+        handle_cgi_request(conn, path);
 #endif /* !NO_CGI */
     } else if (match_prefix(conn->ctx->config[SSI_EXTENSIONS],
                             (int)strlen(conn->ctx->config[SSI_EXTENSIONS]),