Fast and extensible multi-platform HTTP/1-2-3 web server with automatic HTTPS
Mirrored from https://github.com/Slazee/caddy.git
Synced Nov 12, 14:30 UTC
caddyhttp: Allow `header` replacement with empty string (#6163)
Francis Lavoie committed
Mar 21, 2024 at 13:29 UTC
97a56d860a2254f4d9939746a33698b365d546d6
3 files changed
+27
-20
modules/caddyhttp/headers/caddyfile.go
+17
-11
@@ -68,12 +68,14 @@ func parseCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error)
68
if h.NextArg() {
69
hasArgs = true
70
field := h.Val()
71
- var value, replacement string
71
+ var value string
72
+ var replacement *string
73
if h.NextArg() {
74
value = h.Val()
75
}
76
if h.NextArg() {
76
- replacement = h.Val()
77
+ arg := h.Val()
78
+ replacement = &arg
79
}
80
err := applyHeaderOp(
81
handler.Response.HeaderOps,
@@ -106,12 +108,14 @@ func parseCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error)
108
// https://caddy.community/t/v2-reverse-proxy-please-add-cors-example-to-the-docs/7349/19
109
field = strings.TrimSuffix(field, ":")
110
109
- var value, replacement string
111
+ var value string
112
+ var replacement *string
113
if h.NextArg() {
114
value = h.Val()
115
}
116
if h.NextArg() {
114
- replacement = h.Val()
117
+ arg := h.Val()
118
+ replacement = &arg
119
}
120
121
handlerToUse := handler
@@ -170,12 +174,14 @@ func parseReqHdrCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue,
174
// https://caddy.community/t/v2-reverse-proxy-please-add-cors-example-to-the-docs/7349/19
175
field = strings.TrimSuffix(field, ":")
176
173
- var value, replacement string
177
+ var value string
178
+ var replacement *string
179
if h.NextArg() {
180
value = h.Val()
181
}
182
if h.NextArg() {
178
- replacement = h.Val()
183
+ arg := h.Val()
184
+ replacement = &arg
185
if h.NextArg() {
186
return nil, h.ArgErr()
187
}
@@ -200,15 +206,15 @@ func parseReqHdrCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue,
206
// field, value, and replacement. The field can be prefixed with
207
// "+" or "-" to specify adding or removing; otherwise, the value
208
// will be set (overriding any previous value). If replacement is
203
-// non-empty, value will be treated as a regular expression which
209
+// non-nil, value will be treated as a regular expression which
210
// will be used to search and then replacement will be used to
211
// complete the substring replacement; in that case, any + or -
212
// prefix to field will be ignored.
207
-func CaddyfileHeaderOp(ops *HeaderOps, field, value, replacement string) error {
213
+func CaddyfileHeaderOp(ops *HeaderOps, field, value string, replacement *string) error {
214
return applyHeaderOp(ops, nil, field, value, replacement)
215
}
216
211
-func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, replacement string) error {
217
+func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value string, replacement *string) error {
218
switch {
219
case strings.HasPrefix(field, "+"): // append
220
if ops.Add == nil {
@@ -238,7 +244,7 @@ func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, r
244
}
245
respHeaderOps.Set.Set(field, value)
246
241
- case replacement != "": // replace
247
+ case replacement != nil: // replace
248
// allow defer shortcut for replace syntax
249
if strings.HasPrefix(field, ">") && respHeaderOps != nil {
250
respHeaderOps.Deferred = true
@@ -251,7 +257,7 @@ func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, r
257
ops.Replace[field],
258
Replacement{
259
SearchRegexp: value,
254
- Replace: replacement,
260
+ Replace: *replacement,
261
},
262
)
263
modules/caddyhttp/push/caddyfile.go
+3
-3
@@ -73,11 +73,11 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
73
74
switch len(args) {
75
case 1:
76
- err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], "", "")
76
+ err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], "", nil)
77
case 2:
78
- err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], args[1], "")
78
+ err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], args[1], nil)
79
case 3:
80
- err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], args[1], args[2])
80
+ err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], args[1], &args[2])
81
default:
82
return nil, h.ArgErr()
83
}
modules/caddyhttp/reverseproxy/caddyfile.go
+7
-6
@@ -683,7 +683,7 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
683
684
switch len(args) {
685
case 1:
686
- err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], "", "")
686
+ err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], "", nil)
687
case 2:
688
// some lint checks, I guess
689
if strings.EqualFold(args[0], "host") && (args[1] == "{hostport}" || args[1] == "{http.request.hostport}") {
@@ -698,9 +698,9 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
698
if strings.EqualFold(args[0], "x-forwarded-host") && (args[1] == "{host}" || args[1] == "{http.request.host}" || args[1] == "{hostport}" || args[1] == "{http.request.hostport}") {
699
caddy.Log().Named("caddyfile").Warn("Unnecessary header_up X-Forwarded-Host: the reverse proxy's default behavior is to pass headers to the upstream")
700
}
701
- err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], "")
701
+ err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], nil)
702
case 3:
703
- err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], args[2])
703
+ err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], &args[2])
704
default:
705
return d.ArgErr()
706
}
@@ -721,13 +721,14 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
721
}
722
}
723
args := d.RemainingArgs()
724
+
725
switch len(args) {
726
case 1:
726
- err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], "", "")
727
+ err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], "", nil)
728
case 2:
728
- err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], args[1], "")
729
+ err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], args[1], nil)
730
case 3:
730
- err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], args[1], args[2])
731
+ err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], args[1], &args[2])
732
default:
733
return d.ArgErr()
734
}