@marcel91200 / caddy Mirror · read-only / commits / 97a56d86
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 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 }