ParseNamedResponseMatcher parses the tokens of a named response matcher. @name { header <field> [<value>] status <code...> } Or, single line syntax: @name [header <field> [<value>]] | [status <code...>]
(d *caddyfile.Dispenser, matchers map[string]ResponseMatcher)
| 67 | // |
| 68 | // @name [header <field> [<value>]] | [status <code...>] |
| 69 | func ParseNamedResponseMatcher(d *caddyfile.Dispenser, matchers map[string]ResponseMatcher) error { |
| 70 | d.Next() // consume matcher name |
| 71 | definitionName := d.Val() |
| 72 | |
| 73 | if _, ok := matchers[definitionName]; ok { |
| 74 | return d.Errf("matcher is defined more than once: %s", definitionName) |
| 75 | } |
| 76 | |
| 77 | matcher := ResponseMatcher{} |
| 78 | for nesting := d.Nesting(); d.NextArg() || d.NextBlock(nesting); { |
| 79 | switch d.Val() { |
| 80 | case "header": |
| 81 | if matcher.Headers == nil { |
| 82 | matcher.Headers = http.Header{} |
| 83 | } |
| 84 | |
| 85 | // reuse the header request matcher's unmarshaler |
| 86 | headerMatcher := MatchHeader(matcher.Headers) |
| 87 | err := headerMatcher.UnmarshalCaddyfile(d.NewFromNextSegment()) |
| 88 | if err != nil { |
| 89 | return err |
| 90 | } |
| 91 | |
| 92 | matcher.Headers = http.Header(headerMatcher) |
| 93 | case "status": |
| 94 | if matcher.StatusCode == nil { |
| 95 | matcher.StatusCode = []int{} |
| 96 | } |
| 97 | |
| 98 | args := d.RemainingArgs() |
| 99 | if len(args) == 0 { |
| 100 | return d.ArgErr() |
| 101 | } |
| 102 | |
| 103 | for _, arg := range args { |
| 104 | if len(arg) == 3 && strings.HasSuffix(arg, "xx") { |
| 105 | arg = arg[:1] |
| 106 | } |
| 107 | statusNum, err := strconv.Atoi(arg) |
| 108 | if err != nil { |
| 109 | return d.Errf("bad status value '%s': %v", arg, err) |
| 110 | } |
| 111 | matcher.StatusCode = append(matcher.StatusCode, statusNum) |
| 112 | } |
| 113 | default: |
| 114 | return d.Errf("unrecognized response matcher %s", d.Val()) |
| 115 | } |
| 116 | } |
| 117 | matchers[definitionName] = matcher |
| 118 | return nil |
| 119 | } |
no test coverage detected