commit 7b7f166dd58b572989d3980f973d9ed88325ece8
Author:     Laslo Hunhold <[email protected]>
AuthorDate: Tue Feb 27 12:43:05 2018 +0100
Commit:     Laslo Hunhold <[email protected]>
CommitDate: Tue Feb 27 12:43:05 2018 +0100

    Add target prefix mapping
    
    This allows e.g. to redirect when a directory has been moved.

diff --git a/config.def.h b/config.def.h
index 1875ed3..8791951 100644
--- a/config.def.h
+++ b/config.def.h
@@ -25,6 +25,16 @@ static struct {
        { "example.org",     "old\\.example\\.org",         "/",              
"/old" },
 };
 
+/* target prefix mapping */
+static const struct {
+       const char *vhost;
+       const char *from;
+       const char *to;
+} map[] = {
+       /* canonical host    from                   to                 */
+       { "example.org",     "/old/path/to/dir",    "/new/path/to/dir" },
+};
+
 /* mime-types */
 static const struct {
        char *ext;
diff --git a/http.c b/http.c
index 03ba680..d58d94a 100644
--- a/http.c
+++ b/http.c
@@ -351,6 +351,24 @@ http_send_response(int fd, struct request *r)
                }
        }
 
+       /* apply target prefix mapping */
+       for (i = 0; i < LEN(map); i++) {
+               len = strlen(map[i].from);
+               if (!strncmp(realtarget, map[i].from, len)) {
+                       /* match canonical host if vhosts are enabled */
+                       if (vhosts && strcmp(map[i].vhost, vhostmatch)) {
+                               continue;
+                       }
+
+                       /* swap out target prefix */
+                       if (snprintf(realtarget, sizeof(realtarget), "%s%s", 
map[i].to,
+                                    realtarget + len) >= sizeof(realtarget)) {
+                               return http_send_status(fd, 
S_REQUEST_TOO_LARGE);
+                       }
+                       break;
+               }
+       }
+
        /* normalize target */
        if (normabspath(realtarget)) {
                return http_send_status(fd, S_BAD_REQUEST);

Reply via email to