quark

quark web server
git clone git://git.suckless.org/quark
Log | Files | Refs | LICENSE

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:
config.def.h | 10++++++++++
http.c | 18++++++++++++++++++
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);