@marcel91200 / caddy Mirror · read-only / commits / e8352aef
Fork 0

Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS

Mirrored from https://github.com/Slazee/caddy.git

Synced Nov 13, 01:45 UTC

headers: Add > Caddyfile shortcut for enabling defer (#5535)

Francis Lavoie committed May 16, 2023 at 01:18 UTC e8352aef38642c20ff528836b6581094f087eb99
2 files changed +29 -7
caddytest/integration/caddyfile_adapt/header.txt
+12
@@ -17,6 +17,7 @@
17 +Link "Foo"
18 +Link "Bar"
19 }
20 + header >Set Defer
21 }
22 ----------
23 {
@@ -136,6 +137,17 @@
137 ]
138 }
139 }
140 + },
141 + {
142 + "handler": "headers",
143 + "response": {
144 + "deferred": true,
145 + "set": {
146 + "Set": [
147 + "Defer"
148 + ]
149 + }
150 + }
151 }
152 ]
153 }
modules/caddyhttp/headers/caddyfile.go
+17 -7
@@ -32,19 +32,20 @@ func init() {
32 // parseCaddyfile sets up the handler for response headers from
33 // Caddyfile tokens. Syntax:
34 //
35 -// header [<matcher>] [[+|-|?]<field> [<value|regexp>] [<replacement>]] {
36 -// [+]<field> [<value|regexp> [<replacement>]]
37 -// ?<field> <default_value>
38 -// -<field>
39 -// [defer]
35 +// header [<matcher>] [[+|-|?|>]<field> [<value|regexp>] [<replacement>]] {
36 +// [+]<field> [<value|regexp> [<replacement>]]
37 +// ?<field> <default_value>
38 +// -<field>
39 +// ><field>
40 +// [defer]
41 // }
42 //
43 // Either a block can be opened or a single header field can be configured
44 // in the first line, but not both in the same directive. Header operations
45 // are deferred to write-time if any headers are being deleted or if the
46 // 'defer' subdirective is used. + appends a header value, - deletes a field,
46 -// and ? conditionally sets a value only if the header field is not already
47 -// set.
47 +// ? conditionally sets a value only if the header field is not already set,
48 +// and > sets a field with defer enabled.
49 func parseCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error) {
50 if !h.Next() {
51 return nil, h.ArgErr()
@@ -258,6 +259,15 @@ func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, r
259 },
260 )
261
262 + case strings.HasPrefix(field, ">"): // set (overwrite) with defer
263 + if ops.Set == nil {
264 + ops.Set = make(http.Header)
265 + }
266 + ops.Set.Set(field[1:], value)
267 + if respHeaderOps != nil {
268 + respHeaderOps.Deferred = true
269 + }
270 +
271 default: // set (overwrite)
272 if ops.Set == nil {
273 ops.Set = make(http.Header)