Setup makes a config from the tokens.
( inputServerBlocks []caddyfile.ServerBlock, options map[string]any, )
| 55 | |
| 56 | // Setup makes a config from the tokens. |
| 57 | func (st ServerType) Setup( |
| 58 | inputServerBlocks []caddyfile.ServerBlock, |
| 59 | options map[string]any, |
| 60 | ) (*caddy.Config, []caddyconfig.Warning, error) { |
| 61 | var warnings []caddyconfig.Warning |
| 62 | gc := counter{new(int)} |
| 63 | state := make(map[string]any) |
| 64 | |
| 65 | // load all the server blocks and associate them with a "pile" of config values |
| 66 | originalServerBlocks := make([]serverBlock, 0, len(inputServerBlocks)) |
| 67 | for _, sblock := range inputServerBlocks { |
| 68 | for j, k := range sblock.Keys { |
| 69 | if j == 0 && strings.HasPrefix(k.Text, "@") { |
| 70 | return nil, warnings, fmt.Errorf("%s:%d: cannot define a matcher outside of a site block: '%s'", k.File, k.Line, k.Text) |
| 71 | } |
| 72 | if _, ok := registeredDirectives[k.Text]; ok { |
| 73 | return nil, warnings, fmt.Errorf("%s:%d: parsed '%s' as a site address, but it is a known directive; directives must appear in a site block", k.File, k.Line, k.Text) |
| 74 | } |
| 75 | } |
| 76 | originalServerBlocks = append(originalServerBlocks, serverBlock{ |
| 77 | block: sblock, |
| 78 | pile: make(map[string][]ConfigValue), |
| 79 | }) |
| 80 | } |
| 81 | |
| 82 | // apply any global options |
| 83 | var err error |
| 84 | originalServerBlocks, err = st.evaluateGlobalOptionsBlock(originalServerBlocks, options) |
| 85 | if err != nil { |
| 86 | return nil, warnings, err |
| 87 | } |
| 88 | |
| 89 | // this will replace both static and user-defined placeholder shorthands |
| 90 | // with actual identifiers used by Caddy |
| 91 | replacer := NewShorthandReplacer() |
| 92 | |
| 93 | originalServerBlocks, err = st.extractNamedRoutes(originalServerBlocks, options, &warnings, replacer) |
| 94 | if err != nil { |
| 95 | return nil, warnings, err |
| 96 | } |
| 97 | |
| 98 | for _, sb := range originalServerBlocks { |
| 99 | for i := range sb.block.Segments { |
| 100 | replacer.ApplyToSegment(&sb.block.Segments[i]) |
| 101 | } |
| 102 | |
| 103 | if len(sb.block.Keys) == 0 { |
| 104 | return nil, warnings, fmt.Errorf("server block without any key is global configuration, and if used, it must be first") |
| 105 | } |
| 106 | |
| 107 | // extract matcher definitions |
| 108 | matcherDefs := make(map[string]caddy.ModuleMap) |
| 109 | for _, segment := range sb.block.Segments { |
| 110 | if dir := segment.Directive(); strings.HasPrefix(dir, matcherPrefix) { |
| 111 | d := caddyfile.NewDispenser(segment) |
| 112 | err := parseMatcherDefinitions(d, matcherDefs) |
| 113 | if err != nil { |
| 114 | return nil, warnings, err |
nothing calls this directly
no test coverage detected