parseCaddyfile sets up the handler for response headers from Caddyfile tokens. Syntax: header [<matcher>] [[+|-|?|>]<field> [<value|regexp>] [<replacement>]] { [+]<field> [<value|regexp> [<replacement>]] ?<field> <default_value> -<field> ><field> [defer] } Either a block can be opened
(h httpcaddyfile.Helper)
| 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 | h.Next() // consume directive name |
| 51 | matcherSet, err := h.ExtractMatcherSet() |
| 52 | if err != nil { |
| 53 | return nil, err |
| 54 | } |
| 55 | h.Next() // consume the directive name again (matcher parsing resets) |
| 56 | |
| 57 | makeHandler := func() Handler { |
| 58 | return Handler{ |
| 59 | Response: &RespHeaderOps{ |
| 60 | HeaderOps: &HeaderOps{}, |
| 61 | }, |
| 62 | } |
| 63 | } |
| 64 | handler, handlerWithRequire := makeHandler(), makeHandler() |
| 65 | |
| 66 | // first see if headers are in the initial line |
| 67 | var hasArgs bool |
| 68 | if h.NextArg() { |
| 69 | hasArgs = true |
| 70 | field := h.Val() |
| 71 | var value string |
| 72 | var replacement *string |
| 73 | if h.NextArg() { |
| 74 | value = h.Val() |
| 75 | } |
| 76 | if h.NextArg() { |
| 77 | arg := h.Val() |
| 78 | replacement = &arg |
| 79 | } |
| 80 | err := applyHeaderOp( |
| 81 | handler.Response.HeaderOps, |
| 82 | handler.Response, |
| 83 | field, |
| 84 | value, |
| 85 | replacement, |
| 86 | ) |
| 87 | if err != nil { |
| 88 | return nil, h.Err(err.Error()) |
| 89 | } |
| 90 | if len(handler.Response.HeaderOps.Delete) > 0 { |
| 91 | handler.Response.Deferred = true |
| 92 | } |
| 93 | } |
| 94 | |
| 95 | // if not, they should be in a block |
| 96 | for h.NextBlock(0) { |
| 97 | field := h.Val() |
| 98 | if field == "defer" { |
| 99 | handler.Response.Deferred = true |
| 100 | continue |
| 101 | } |
| 102 | if field == "match" { |
| 103 | responseMatchers := make(map[string]caddyhttp.ResponseMatcher) |
| 104 | err := caddyhttp.ParseNamedResponseMatcher(h.NewFromNextSegment(), responseMatchers) |
| 105 | if err != nil { |
| 106 | return nil, err |
nothing calls this directly
no test coverage detected