aboutsummaryrefslogtreecommitdiffstats
path: root/src/config/lexparse.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/config/lexparse.c')
-rw-r--r--src/config/lexparse.c25
1 files changed, 25 insertions, 0 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 ;