diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/config/lexparse.c | 25 | ||||
| -rw-r--r-- | src/libtipidee/tipidee_conf_get_redirection.c | 5 |
2 files changed, 26 insertions, 4 deletions
diff --git a/src/config/lexparse.c b/src/config/lexparse.c index 160aa97..ad22762 100644 --- a/src/config/lexparse.c +++ b/src/config/lexparse.c @@ -44,6 +44,7 @@ enum directivevalue_e T_DOMAIN, T_NPHPREFIX, T_REDIRECT, + T_NOREDIRECT, T_CGI, T_NONCGI, T_NPH, @@ -245,6 +246,26 @@ static inline void parse_customheader (char const *s, size_t const *word, size_t } } +static inline void parse_noredirect (char const *s, size_t const *word, size_t n, char const *domain, size_t domainlen, mdt const *md) +{ + if (n != 1) + strerr_dief8x(1, "too ", n > 1 ? "many" : "few", " arguments to directive ", "noredirect", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ; + if (!domain) + strerr_dief6x(1, "noredirection", " without a domain directive", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ; + if (s[*word] != '/') + strerr_dief6x(1, "noredirected resource", " must start with /", " in file ", g.storage.s + md->filepos, " line ", md->linefmt) ; + { + size_t urlen = strlen(s + *word) ; + char key[3 + domainlen + urlen] ; + if (s[*word + urlen - 1] == '/') { key[0] = 'r' ; urlen-- ; } else key[0] = 'R' ; + key[1] = ':' ; + memcpy(key + 2, domain, domainlen) ; + memcpy(key + 2 + domainlen, s + *word, urlen) ; + key[2 + domainlen + urlen] = 0 ; + add_unique(key, " ", 2, md) ; + } +} + static inline void parse_redirect (char const *s, size_t const *word, size_t n, char const *domain, size_t domainlen, mdt const *md) { static uint32_t const codes[4] = { 307, 308, 302, 301 } ; @@ -425,6 +446,7 @@ static inline void process_line (char const *s, size_t const *word, size_t n, st { .name = "noautochunk", .value = T_NOAUTOCHUNK }, { .name = "noncgi", .value = T_NONCGI }, { .name = "nonnph", .value = T_NONNPH }, + { .name = "noredirect", .value = T_NOREDIRECT }, { .name = "nph", .value = T_NPH }, { .name = "nph-prefix", .value = T_NPHPREFIX }, { .name = "redirect", .value = T_REDIRECT }, @@ -492,6 +514,9 @@ static inline void process_line (char const *s, size_t const *word, size_t n, st case T_REDIRECT : parse_redirect(s, word, n, domain->s, domain->len, md) ; break ; + case T_NOREDIRECT : + parse_noredirect(s, word, n, domain->s, domain->len, md) ; + break ; case T_CGI : parse_bitattr(s, word, n, domain->s, domain->len, md, 0, 1) ; break ; diff --git a/src/libtipidee/tipidee_conf_get_redirection.c b/src/libtipidee/tipidee_conf_get_redirection.c index b117481..9554227 100644 --- a/src/libtipidee/tipidee_conf_get_redirection.c +++ b/src/libtipidee/tipidee_conf_get_redirection.c @@ -3,8 +3,6 @@ #include <errno.h> #include <string.h> -#include <skalibs/lolstdio.h> - #include <tipidee/conf.h> #include <skalibs/posixishard.h> @@ -24,12 +22,11 @@ static int get_redir (tipidee_conf const *conf, size_t minl, char *key, size_t l v = tipidee_conf_get_string(conf, key) ; key[0] = 'r' ; } - if (!v) return 0 ; + if (!v || v[0] == ' ') return 0 ; if (v[0] < '@' || v[0] > 'C') return (errno = EPROTO, -1) ; r->type = v[0] & ~'@' ; r->location = v+1 ; r->sub = path + (l - minl + 1) ; - LOLDEBUG("get_redir: found redirection of type %c to %s with sub %s", v[0], r->location, r->sub) ; return 1 ; } |
