commit 7b7f166dd58b572989d3980f973d9ed88325ece8
parent 02d6ae5a5714ad24ea0d56a1d575c3dc72bb6949
Author: Laslo Hunhold <dev@frign.de>
Date:   Tue, 27 Feb 2018 12:43:05 +0100
Add target prefix mapping
This allows e.g. to redirect when a directory has been moved.
Diffstat:
2 files changed, 28 insertions(+), 0 deletions(-)
diff --git 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
@@ -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);