Skip to content

Commit 97a56d8

Browse files
caddyhttp: Allow header replacement with empty string (#6163)
1 parent d132584 commit 97a56d8

File tree

3 files changed

+27
-20
lines changed

3 files changed

+27
-20
lines changed

modules/caddyhttp/headers/caddyfile.go

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,14 @@ func parseCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error)
6868
if h.NextArg() {
6969
hasArgs = true
7070
field := h.Val()
71-
var value, replacement string
71+
var value string
72+
var replacement *string
7273
if h.NextArg() {
7374
value = h.Val()
7475
}
7576
if h.NextArg() {
76-
replacement = h.Val()
77+
arg := h.Val()
78+
replacement = &arg
7779
}
7880
err := applyHeaderOp(
7981
handler.Response.HeaderOps,
@@ -106,12 +108,14 @@ func parseCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue, error)
106108
// https://caddy.community/t/v2-reverse-proxy-please-add-cors-example-to-the-docs/7349/19
107109
field = strings.TrimSuffix(field, ":")
108110

109-
var value, replacement string
111+
var value string
112+
var replacement *string
110113
if h.NextArg() {
111114
value = h.Val()
112115
}
113116
if h.NextArg() {
114-
replacement = h.Val()
117+
arg := h.Val()
118+
replacement = &arg
115119
}
116120

117121
handlerToUse := handler
@@ -170,12 +174,14 @@ func parseReqHdrCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue,
170174
// https://caddy.community/t/v2-reverse-proxy-please-add-cors-example-to-the-docs/7349/19
171175
field = strings.TrimSuffix(field, ":")
172176

173-
var value, replacement string
177+
var value string
178+
var replacement *string
174179
if h.NextArg() {
175180
value = h.Val()
176181
}
177182
if h.NextArg() {
178-
replacement = h.Val()
183+
arg := h.Val()
184+
replacement = &arg
179185
if h.NextArg() {
180186
return nil, h.ArgErr()
181187
}
@@ -200,15 +206,15 @@ func parseReqHdrCaddyfile(h httpcaddyfile.Helper) ([]httpcaddyfile.ConfigValue,
200206
// field, value, and replacement. The field can be prefixed with
201207
// "+" or "-" to specify adding or removing; otherwise, the value
202208
// 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
204210
// will be used to search and then replacement will be used to
205211
// complete the substring replacement; in that case, any + or -
206212
// 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 {
208214
return applyHeaderOp(ops, nil, field, value, replacement)
209215
}
210216

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 {
212218
switch {
213219
case strings.HasPrefix(field, "+"): // append
214220
if ops.Add == nil {
@@ -238,7 +244,7 @@ func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, r
238244
}
239245
respHeaderOps.Set.Set(field, value)
240246

241-
case replacement != "": // replace
247+
case replacement != nil: // replace
242248
// allow defer shortcut for replace syntax
243249
if strings.HasPrefix(field, ">") && respHeaderOps != nil {
244250
respHeaderOps.Deferred = true
@@ -251,7 +257,7 @@ func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value, r
251257
ops.Replace[field],
252258
Replacement{
253259
SearchRegexp: value,
254-
Replace: replacement,
260+
Replace: *replacement,
255261
},
256262
)
257263

modules/caddyhttp/push/caddyfile.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,11 @@ func parseCaddyfile(h httpcaddyfile.Helper) (caddyhttp.MiddlewareHandler, error)
7373

7474
switch len(args) {
7575
case 1:
76-
err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], "", "")
76+
err = headers.CaddyfileHeaderOp(&handler.Headers.HeaderOps, args[0], "", nil)
7777
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)
7979
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])
8181
default:
8282
return nil, h.ArgErr()
8383
}

modules/caddyhttp/reverseproxy/caddyfile.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -683,7 +683,7 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
683683

684684
switch len(args) {
685685
case 1:
686-
err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], "", "")
686+
err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], "", nil)
687687
case 2:
688688
// some lint checks, I guess
689689
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 {
698698
if strings.EqualFold(args[0], "x-forwarded-host") && (args[1] == "{host}" || args[1] == "{http.request.host}" || args[1] == "{hostport}" || args[1] == "{http.request.hostport}") {
699699
caddy.Log().Named("caddyfile").Warn("Unnecessary header_up X-Forwarded-Host: the reverse proxy's default behavior is to pass headers to the upstream")
700700
}
701-
err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], "")
701+
err = headers.CaddyfileHeaderOp(h.Headers.Request, args[0], args[1], nil)
702702
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])
704704
default:
705705
return d.ArgErr()
706706
}
@@ -721,13 +721,14 @@ func (h *Handler) UnmarshalCaddyfile(d *caddyfile.Dispenser) error {
721721
}
722722
}
723723
args := d.RemainingArgs()
724+
724725
switch len(args) {
725726
case 1:
726-
err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], "", "")
727+
err = headers.CaddyfileHeaderOp(h.Headers.Response.HeaderOps, args[0], "", nil)
727728
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)
729730
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])
731732
default:
732733
return d.ArgErr()
733734
}

0 commit comments

Comments
 (0)