(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value string, replacement *string)
| 223 | } |
| 224 | |
| 225 | func applyHeaderOp(ops *HeaderOps, respHeaderOps *RespHeaderOps, field, value string, replacement *string) error { |
| 226 | switch { |
| 227 | case strings.HasPrefix(field, "+"): // append |
| 228 | if ops.Add == nil { |
| 229 | ops.Add = make(http.Header) |
| 230 | } |
| 231 | ops.Add.Add(field[1:], value) |
| 232 | |
| 233 | case strings.HasPrefix(field, "-"): // delete |
| 234 | ops.Delete = append(ops.Delete, field[1:]) |
| 235 | if respHeaderOps != nil { |
| 236 | respHeaderOps.Deferred = true |
| 237 | } |
| 238 | |
| 239 | case strings.HasPrefix(field, "?"): // default (conditional on not existing) - response headers only |
| 240 | if respHeaderOps == nil { |
| 241 | return fmt.Errorf("%v: the default header modifier ('?') can only be used on response headers; for conditional manipulation of request headers, use matchers", field) |
| 242 | } |
| 243 | if respHeaderOps.Require == nil { |
| 244 | respHeaderOps.Require = &caddyhttp.ResponseMatcher{ |
| 245 | Headers: make(http.Header), |
| 246 | } |
| 247 | } |
| 248 | field = strings.TrimPrefix(field, "?") |
| 249 | respHeaderOps.Require.Headers[field] = nil |
| 250 | if respHeaderOps.Set == nil { |
| 251 | respHeaderOps.Set = make(http.Header) |
| 252 | } |
| 253 | respHeaderOps.Set.Set(field, value) |
| 254 | |
| 255 | case replacement != nil: // replace |
| 256 | // allow defer shortcut for replace syntax |
| 257 | if strings.HasPrefix(field, ">") && respHeaderOps != nil { |
| 258 | respHeaderOps.Deferred = true |
| 259 | } |
| 260 | if ops.Replace == nil { |
| 261 | ops.Replace = make(map[string][]Replacement) |
| 262 | } |
| 263 | field = strings.TrimLeft(field, "+-?>") |
| 264 | ops.Replace[field] = append( |
| 265 | ops.Replace[field], |
| 266 | Replacement{ |
| 267 | SearchRegexp: value, |
| 268 | Replace: *replacement, |
| 269 | }, |
| 270 | ) |
| 271 | |
| 272 | case strings.HasPrefix(field, ">"): // set (overwrite) with defer |
| 273 | if ops.Set == nil { |
| 274 | ops.Set = make(http.Header) |
| 275 | } |
| 276 | ops.Set.Set(field[1:], value) |
| 277 | if respHeaderOps != nil { |
| 278 | respHeaderOps.Deferred = true |
| 279 | } |
| 280 | |
| 281 | default: // set (overwrite) |
| 282 | if ops.Set == nil { |
no test coverage detected