Skip to content

Commit

Permalink
caddyhttp: Merge header matchers in Caddyfile (#3832)
Browse files Browse the repository at this point in the history
  • Loading branch information
francislavoie authored Oct 31, 2020
1 parent b660993 commit 966d5e6
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 1 deletion.
28 changes: 28 additions & 0 deletions caddytest/integration/caddyfile_adapt/matcher_syntax.txt
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@

@matcher6 vars_regexp "{http.request.uri}" `\.([a-f0-9]{6})\.(css|js)$`
respond @matcher6 "from vars_regexp matcher without name"

@matcher7 {
header Foo bar
header Foo foobar
header Bar foo
}
respond @matcher7 "header matcher merging values of the same field"
}
----------
{
Expand Down Expand Up @@ -127,6 +134,27 @@
"handler": "static_response"
}
]
},
{
"match": [
{
"header": {
"Bar": [
"foo"
],
"Foo": [
"bar",
"foobar"
]
}
}
],
"handle": [
{
"body": "header matcher merging values of the same field",
"handler": "static_response"
}
]
}
]
}
Expand Down
11 changes: 10 additions & 1 deletion modules/caddyhttp/matchers.go
Original file line number Diff line number Diff line change
Expand Up @@ -408,7 +408,16 @@ func (m *MatchHeader) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
if !d.Args(&field, &val) {
return d.Errf("malformed header matcher: expected both field and value")
}
http.Header(*m).Set(field, val)

// 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)
existing := http.Header(*m).Values(field)
if len(existing) > 0 {
http.Header(*m).Add(field, val)
} else {
http.Header(*m).Set(field, val)
}

if d.NextBlock(0) {
return d.Err("malformed header matcher: blocks are not supported")
}
Expand Down

0 comments on commit 966d5e6

Please sign in to comment.