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)