diff options
| author | Francis Lavoie <lavofr@gmail.com> | 2022-04-25 12:47:12 -0400 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-04-25 10:47:12 -0600 | 
| commit | a8bb4a665af358f61a7ac0eabac8df2110cb6a36 (patch) | |
| tree | fda9f8d00ae46996626cd9e007914ee56bed327d | |
| parent | 3a1e0dbf47429f3ae7ddcbbd9acc3707b0ad0083 (diff) | |
httpcaddyfile: Add `{vars.*}` placeholder shortcut, reverse `vars` sort order (#4726)
* httpcaddyfile: Add `{vars.*}` placeholder shortcut
I'm yoinking this from my https://github.com/caddyserver/caddy/pull/4657 PR because I think we should get this in ASAP for v2.5.0 along with the new `vars` directive.
* Sort vars by matchers in reverse
| -rw-r--r-- | caddyconfig/httpcaddyfile/directives.go | 29 | ||||
| -rw-r--r-- | caddyconfig/httpcaddyfile/httptype.go | 1 | ||||
| -rw-r--r-- | caddytest/integration/caddyfile_adapt/sort_vars_in_reverse.txt | 59 | 
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  | 
