From 5931a158a4df45904b28bcd8e85cbddca61e4b7d Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 10 Nov 2010 20:52:30 +0000 Subject: [PATCH] uhttpd: redirect to same location with trailing slash appended if directories are requested SVN-Revision: 23952 --- package/uhttpd/Makefile | 2 +- package/uhttpd/src/uhttpd-utils.c | 21 +++++++++++++++++++-- package/uhttpd/src/uhttpd-utils.h | 1 + package/uhttpd/src/uhttpd.c | 3 +-- 4 files changed, 22 insertions(+), 5 deletions(-) diff --git a/package/uhttpd/Makefile b/package/uhttpd/Makefile index 29d3ee5b1f..b639c007b2 100644 --- a/package/uhttpd/Makefile +++ b/package/uhttpd/Makefile @@ -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 diff --git a/package/uhttpd/src/uhttpd-utils.c b/package/uhttpd/src/uhttpd-utils.c index 9f9a5dd6a7..c7bc867aab 100644 --- a/package/uhttpd/src/uhttpd-utils.c +++ b/package/uhttpd/src/uhttpd-utils.c @@ -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)); diff --git a/package/uhttpd/src/uhttpd-utils.h b/package/uhttpd/src/uhttpd-utils.h index 6a0a395a91..769e5b45d6 100644 --- a/package/uhttpd/src/uhttpd-utils.h +++ b/package/uhttpd/src/uhttpd-utils.h @@ -52,6 +52,7 @@ struct path_info { char *name; char *info; char *query; + int redirected; struct stat stat; }; diff --git a/package/uhttpd/src/uhttpd.c b/package/uhttpd/src/uhttpd.c index a818e1c450..491452b634 100644 --- a/package/uhttpd/src/uhttpd.c +++ b/package/uhttpd/src/uhttpd.c @@ -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; } - -- 2.30.2