summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--caddyconfig/httpcaddyfile/directives.go29
-rw-r--r--caddyconfig/httpcaddyfile/httptype.go1
-rw-r--r--caddytest/integration/caddyfile_adapt/sort_vars_in_reverse.txt59
3 files changed, 82 insertions, 7 deletions
diff --git a/caddyconfig/httpcaddyfile/directives.go b/caddyconfig/httpcaddyfile/directives.go
index 6b80e34..aaa8cb0 100644
--- a/caddyconfig/httpcaddyfile/directives.go
+++ b/caddyconfig/httpcaddyfile/directives.go
@@ -424,14 +424,29 @@ func sortRoutes(routes []ConfigValue) {
jPathLen = len(jPM[0])
}
- // if both directives have no path matcher, use whichever one
- // has any kind of matcher defined first.
- if iPathLen == 0 && jPathLen == 0 {
- return len(iRoute.MatcherSetsRaw) > 0 && len(jRoute.MatcherSetsRaw) == 0
- }
+ // some directives involve setting values which can overwrite
+ // eachother, so it makes most sense to reverse the order so
+ // that the lease specific matcher is first; everything else
+ // has most-specific matcher first
+ if iDir == "vars" {
+ // if both directives have no path matcher, use whichever one
+ // has no matcher first.
+ if iPathLen == 0 && jPathLen == 0 {
+ return len(iRoute.MatcherSetsRaw) == 0 && len(jRoute.MatcherSetsRaw) > 0
+ }
+
+ // sort with the least-specific (shortest) path first
+ return iPathLen < jPathLen
+ } else {
+ // if both directives have no path matcher, use whichever one
+ // has any kind of matcher defined first.
+ if iPathLen == 0 && jPathLen == 0 {
+ return len(iRoute.MatcherSetsRaw) > 0 && len(jRoute.MatcherSetsRaw) == 0
+ }
- // sort with the most-specific (longest) path first
- return iPathLen > jPathLen
+ // sort with the most-specific (longest) path first
+ return iPathLen > jPathLen
+ }
})
}
diff --git a/caddyconfig/httpcaddyfile/httptype.go b/caddyconfig/httpcaddyfile/httptype.go
index 4f9f8d0..5b0d845 100644
--- a/caddyconfig/httpcaddyfile/httptype.go
+++ b/caddyconfig/httpcaddyfile/httptype.go
@@ -129,6 +129,7 @@ func (st ServerType) Setup(inputServerBlocks []caddyfile.ServerBlock,
{regexp.MustCompile(`{header\.([\w-]*)}`), "{http.request.header.$1}"},
{regexp.MustCompile(`{path\.([\w-]*)}`), "{http.request.uri.path.$1}"},
{regexp.MustCompile(`{re\.([\w-]*)\.([\w-]*)}`), "{http.regexp.$1.$2}"},
+ {regexp.MustCompile(`{vars\.([\w-]*)}`), "{http.vars.$1}"},
}
for _, sb := range originalServerBlocks {
diff --git a/caddytest/integration/caddyfile_adapt/sort_vars_in_reverse.txt b/caddytest/integration/caddyfile_adapt/sort_vars_in_reverse.txt
new file mode 100644
index 0000000..dff75e1
--- /dev/null
+++ b/caddytest/integration/caddyfile_adapt/sort_vars_in_reverse.txt
@@ -0,0 +1,59 @@
+:80
+
+vars /foobar foo last
+vars /foo foo middle
+vars * foo first
+----------
+{
+ "apps": {
+ "http": {
+ "servers": {
+ "srv0": {
+ "listen": [
+ ":80"
+ ],
+ "routes": [
+ {
+ "handle": [
+ {
+ "foo": "first",
+ "handler": "vars"
+ }
+ ]
+ },
+ {
+ "match": [
+ {
+ "path": [
+ "/foo"
+ ]
+ }
+ ],
+ "handle": [
+ {
+ "foo": "middle",
+ "handler": "vars"
+ }
+ ]
+ },
+ {
+ "match": [
+ {
+ "path": [
+ "/foobar"
+ ]
+ }
+ ],
+ "handle": [
+ {
+ "foo": "last",
+ "handler": "vars"
+ }
+ ]
+ }
+ ]
+ }
+ }
+ }
+ }
+} \ No newline at end of file