Skip to content

Semantics of url rewrite prefix replace - clarifications required #3592

Open
@LiorLieberman

Description

@LiorLieberman

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.

/cc @mikemorris @arkodg @robscott @howardjohn @kflynn

Metadata

Metadata

Assignees

No one assigned

    Labels

    triage/needs-alignmentAccepted, but stakeholders are working through contention here to find the best compromise.

    Type

    Projects

    Status

    Next

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions