Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

http map not fully supported #103

Open
chrisnovakovic opened this issue Jul 19, 2022 · 0 comments
Open

http map not fully supported #103

chrisnovakovic opened this issue Jul 19, 2022 · 0 comments

Comments

@chrisnovakovic
Copy link

Describe the bug

This is similar to #101 but slightly different because of the extra expressiveness of map compared to types.

The analyser doesn't take into account the special syntax of http map blocks, in which directives are one of a handful of special directives or arbitrary strings. The analyser also doesn't support any of the special directives listed in the ngx_http_map_module documentation. This means that crossplane doesn't recognise Nginx configurations containing map blocks as valid when running in strict mode, which verifies that directive names are present in the analyser's allowlist. A similar problem occurs when check_ctx=True is set via the API.

To Reproduce

Run crossplane parse --strict on the following Nginx configuration:

http {
    map $http_host $name {
        hostnames;
        volatile;
        default 0;
        example.com 1;
        include map_values.conf;
    }
}

# map_values.conf:

*.example.com 2;
\volatile 3;

This outputs:

{"status":"failed","errors":[{"file":"nginx.conf","error":"unknown directive \"hostnames\" in nginx.conf:3","line":3},{"file":"nginx.conf","error":"unknown directive \"volatile\" in nginx.conf:4","line":4},{"file":"nginx.conf","error":"unknown directive \"default\" in nginx.conf:5","line":5},{"file":"nginx.conf","error":"unknown directive \"example.com\" in nginx.conf:6","line":6},{"file":"map_values.conf","error":"unknown directive \"*.example.com\" in map_values.conf:1","line":1},{"file":"map_values.conf","error":"unknown directive \"\\volatile\" in map_values.conf:2","line":2}],"config":[{"file":"nginx.conf","status":"failed","errors":[{"error":"unknown directive \"hostnames\" in nginx.conf:3","line":3},{"error":"unknown directive \"volatile\" in nginx.conf:4","line":4},{"error":"unknown directive \"default\" in nginx.conf:5","line":5},{"error":"unknown directive \"example.com\" in nginx.conf:6","line":6}],"parsed":[{"directive":"http","line":1,"args":[],"block":[{"directive":"map","line":2,"args":["$http_host","$name"],"block":[{"directive":"include","line":7,"args":["map_values.conf"],"includes":[1]}]}]}]},{"file":"map_values.conf","status":"failed","errors":[{"error":"unknown directive \"*.example.com\" in map_values.conf:1","line":1},{"error":"unknown directive \"\\volatile\" in map_values.conf:2","line":2}],"parsed":[]}]}

Expected behavior

No errors are encountered, and an AST is printed.

Your environment

crossplane v0.5.7 (although the problem also exists on master)

chrisnovakovic added a commit to chrisnovakovic/crossplane that referenced this issue Jul 19, 2022
The `map` directive (from ngx_http_map_module and ngx_stream_map_module)
and `types` directive (from ngx_http_core_module) are distinct from
other directives, in that their child directives may be arbitrary
strings that aren't known to Nginx. This causes crossplane to report
unrecognised/misused directive errors when analysing them with `strict`
or `check_ctx` enabled; it also means that no meaningful analysis can be
be performed when `check_args` is enabled because the arity of child
directives is unknown.

Add support for `map`'s special directives (`default`, `hostnames`, and
`volatile`) to the analyser. Recognise that arbitrary directive names
inside a `map` or `types` block are valid and that they accept either
one argument (if used in `map`) or one or more arguments (if used in
`types`).

Fixes nginxinc#101 and nginxinc#103.
chrisnovakovic added a commit to chrisnovakovic/crossplane that referenced this issue Jul 19, 2022
The `map` directive (from ngx_http_map_module and ngx_stream_map_module)
and `types` directive (from ngx_http_core_module) are distinct from
other directives, in that their child directives may be arbitrary
strings that aren't known to Nginx. This causes crossplane to report
unrecognised/misused directive errors when analysing them with `strict`
or `check_ctx` enabled; it also means that no meaningful analysis can be
performed when `check_args` is enabled because the arity of child
directives is unknown.

Add support for `map`'s special directives (`default`, `hostnames`, and
`volatile`) to the analyser. Recognise that arbitrary directive names
inside a `map` or `types` block are valid and that they accept either
one argument (if used in `map`) or one or more arguments (if used in
`types`).

Fixes nginxinc#101 and nginxinc#103.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant