From c898a37f4080fe3013974bee9a44ce98bd900cc3 Mon Sep 17 00:00:00 2001 From: Jack Baron Date: Wed, 9 Dec 2020 18:28:14 +0000 Subject: httpcaddyfile: support matching headers that do not exist (#3909) * add integration test for null header matcher * implement null header matcher syntax * avoid repeating magic ! * check for field following ! character --- modules/caddyhttp/matchers.go | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) (limited to 'modules/caddyhttp/matchers.go') diff --git a/modules/caddyhttp/matchers.go b/modules/caddyhttp/matchers.go index c5cf21d..4886ba6 100644 --- a/modules/caddyhttp/matchers.go +++ b/modules/caddyhttp/matchers.go @@ -470,13 +470,32 @@ func (m *MatchHeader) UnmarshalCaddyfile(d *caddyfile.Dispenser) error { } for d.Next() { var field, val string - if !d.Args(&field, &val) { - return d.Errf("malformed header matcher: expected both field and value") + if !d.Args(&field) { + return d.Errf("malformed header matcher: expected field") } - // If multiple header matchers with the same header field are defined, - // we want to add the existing to the list of headers (will be OR'ed) - http.Header(*m).Add(field, val) + if strings.HasPrefix(field, "!") { + if len(field) == 1 { + return d.Errf("malformed header matcher: must have field name following ! character") + } + + field = field[1:] + headers := *m + headers[field] = nil + m = &headers + if d.NextArg() { + return d.Errf("malformed header matcher: null matching headers cannot have a field value") + } + } else { + if !d.NextArg() { + return d.Errf("malformed header matcher: expected both field and value") + } + + // If multiple header matchers with the same header field are defined, + // we want to add the existing to the list of headers (will be OR'ed) + val = d.Val() + http.Header(*m).Add(field, val) + } if d.NextBlock(0) { return d.Err("malformed header matcher: blocks are not supported") -- cgit v1.2.3