Add target prefix mapping

This allows e.g. to redirect when a directory has been moved.
This commit is contained in:
Laslo Hunhold 2018-02-27 12:43:05 +01:00
parent 02d6ae5a57
commit 7b7f166dd5
2 changed files with 28 additions and 0 deletions

View file

@ -25,6 +25,16 @@ static struct {
{ "example.org", "old\\.example\\.org", "/", "/old" }, { "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 */ /* mime-types */
static const struct { static const struct {
char *ext; char *ext;

18
http.c
View file

@ -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 */ /* normalize target */
if (normabspath(realtarget)) { if (normabspath(realtarget)) {
return http_send_status(fd, S_BAD_REQUEST); return http_send_status(fd, S_BAD_REQUEST);