Description
This is a followup to a surprisingly long thread on slack.
Our spec has a very detailed table of expectations for ReplacePrefixMatch
field. However it does not cover the case where the Prefix Match
(not the replacement) is "/".
Adding the spec table here for convenience:
// Request Path | Prefix Match | Replace Prefix | Modified Path
// -------------|--------------|----------------|----------
// /foo/bar | /foo | /xyz | /xyz/bar
// /foo/bar | /foo | /xyz/ | /xyz/bar
// /foo/bar | /foo/ | /xyz | /xyz/bar
// /foo/bar | /foo/ | /xyz/ | /xyz/bar
// /foo | /foo | /xyz | /xyz
// /foo/ | /foo | /xyz | /xyz/
// /foo/bar | /foo | <empty string> | /bar
// /foo/ | /foo | <empty string> | /
// /foo | /foo | <empty string> | /
// /foo/ | /foo | / | /
// /foo | /foo | / | /
The ambiguity mostly comes down to the case where Prefix Match is "/". Below are a few examples:
// Request Path | Prefix Match | Replace Prefix | Modified Path
// -------------|--------------|----------------|----------
// /bar | / | /xyz | /xyz/bar (AND NOT "/xyzbar")
// /bar | / | /xyz/ | /xyz/bar (AND NOT "/xyz//bar")
// / | / | /xyz | /xyz (AND NOT "/xyz/")
// /bar | / | <empty string> | /bar (And NOT "bar")
// / | / | <empty string> | / (AND NOT "")
// / | / | / | /
AND NOT is a language I used to reflect the proposed standardization. You can also be read it as OR if you have a different opinion.
Although there is no easy way in envoy to achieve this behavior (other non-envoy implementations, please shout if this is easily possible with your proxies), @howardjohn came up with a regex that makes this possible (ref https://github.com/istio/istio/pull/54939/files#diff-a0e8831b6aefb0ef9b2cd269fcd726b26fd1104120950952b5217a7b104ba153R1668-R1669)
Hoping this thread would result in a change to our spec to explicitly iron it out.
Metadata
Metadata
Assignees
Type
Projects
Status