uhttpd: redirect to same location with trailing slash appended if directories are...
authorJo-Philipp Wich <jow@openwrt.org>
Wed, 10 Nov 2010 20:52:30 +0000 (20:52 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Wed, 10 Nov 2010 20:52:30 +0000 (20:52 +0000)
SVN-Revision: 23952

package/uhttpd/Makefile
package/uhttpd/src/uhttpd-utils.c
package/uhttpd/src/uhttpd-utils.h
package/uhttpd/src/uhttpd.c

index 29d3ee5b1fd960b0f8a026894e76bbb06b0a66cf..b639c007b2c00e6b873c73ceb3e644e9f59076bf 100644 (file)
@@ -8,7 +8,7 @@
 include $(TOPDIR)/rules.mk
 
 PKG_NAME:=uhttpd
-PKG_RELEASE:=18
+PKG_RELEASE:=19
 
 PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
 PKG_BUILD_DEPENDS := libcyassl liblua
index 9f9a5dd6a7f4d3dd5cc081d21178d5708f038e00..c7bc867aab2da63913d48548070a6ecfc99fa959 100644 (file)
@@ -474,6 +474,7 @@ struct path_info * uh_path_lookup(struct client *cl, const char *url)
        char *docroot = cl->server->conf->docroot;
        char *pathptr = NULL;
 
+       int slash = 0;
        int no_sym = cl->server->conf->no_symlinks;
        int i = 0;
        struct stat s;
@@ -516,7 +517,7 @@ struct path_info * uh_path_lookup(struct client *cl, const char *url)
        }
 
        /* create canon path */
-       for( i = strlen(buffer); i >= 0; i-- )
+       for( i = strlen(buffer), slash = (buffer[max(0, i-1)] == '/'); i >= 0; i-- )
        {
                if( (buffer[i] == 0) || (buffer[i] == '/') )
                {
@@ -567,7 +568,23 @@ struct path_info * uh_path_lookup(struct client *cl, const char *url)
                        memcpy(buffer, path_phys, sizeof(buffer));
                        pathptr = &buffer[strlen(buffer)];
 
-                       if( cl->server->conf->index_file )
+                       /* if requested url resolves to a directory and a trailing slash
+                          is missing in the request url, redirect the client to the same
+                          url with trailing slash appended */
+                       if( !slash )
+                       {
+                               uh_http_sendf(cl, NULL,
+                                       "HTTP/1.1 302 Found\r\n"
+                                       "Location: %s%s%s\r\n"
+                                       "Connection: close\r\n\r\n",
+                                               &path_phys[strlen(docroot)],
+                                               p.query ? "?" : "",
+                                               p.query ? p.query : ""
+                               );
+
+                               p.redirected = 1;
+                       }
+                       else if( cl->server->conf->index_file )
                        {
                                strncat(buffer, cl->server->conf->index_file, sizeof(buffer));
 
index 6a0a395a9130c0bb89e932f64a54a8cd5ddf143a..769e5b45d6137801f79ce4440e09e691f52d814c 100644 (file)
@@ -52,6 +52,7 @@ struct path_info {
        char *name;
        char *info;
        char *query;
+       int redirected;
        struct stat stat;
 };
 
index a818e1c4507e58ff55f501b7bb28a7462df57e45..491452b6349c7fddddb3d6dca54e80d63f0cfca1 100644 (file)
@@ -566,7 +566,7 @@ static void uh_mainloop(struct config *conf, fd_set serv_fds, int max_fd)
                                                if( (pin = uh_path_lookup(cl, req->url)) != NULL )
                                                {
                                                        /* auth ok? */
-                                                       if( uh_auth_check(cl, req, pin) )
+                                                       if( !pin->redirected && uh_auth_check(cl, req, pin) )
                                                                uh_dispatch_request(cl, req, pin);
                                                }
 
@@ -1089,4 +1089,3 @@ int main (int argc, char **argv)
 
        return 0;
 }
-