Add target prefix mapping - quark - quark web server
 (HTM) git clone git://git.suckless.org/quark
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 7b7f166dd58b572989d3980f973d9ed88325ece8
 (DIR) parent 02d6ae5a5714ad24ea0d56a1d575c3dc72bb6949
 (HTM) 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:
         M config.def.h                        |      10 ++++++++++
         M http.c                              |      18 ++++++++++++++++++
       
       2 files changed, 28 insertions(+), 0 deletions(-)
       ---
 (DIR) 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;
 (DIR) 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);