-
Notifications
You must be signed in to change notification settings - Fork 845
Description
When ATS is configured with proxy.config.http.redirection_enabled set to 1 and proxy.config.http.number_of_redirections set to N, ATS will follow up to N redirects seen from origin hosts.
RFC 7231 § 7.1.2 allows for the Location header field to contain a relative URI reference. This means that the value of the Location can contain a URI without a host name.
If ATS follows N redirects, its behavior for the N+1st redirect is to reply with the origin's response to the client. The problem with this is that the origin host may change in the course of following redirects 1 through N, and so the final redirect response could result in the wrong effective URI being followed by the client.
Example:
Given proxy.config.http.redirection_enabled=1 and proxy.config.http.number_of_redirections=1, consider the sequence:
- Client -> ATS:
GET foo.test/ - ATS -> foo.test:
GET foo.test/ - ATS <- foo.test:
302 Redirect to bar.test/ - ATS -> bar.test:
GET bar.test/(the redirect is followed by ATS) - ATS <- bar.test:
302 Redirect to /kau - Client <- ATS:
302 Redirect to /kau(the redirect is not followed ATS)
At this point the client will follow RFC 7231 § 7.1.2 regarding the value of the Location field:
the final value is computed by resolving it against the effective request URI
Therefore the Client would attempt to follow the redirect to foo.com/kau when the intended URI is bar.com/kau.
The missing host in the Location URI must be replaced with the correct value in cases when it is different from the effective client request. But the correct value of the missing host is dependent upon the architecture of which ATS is a part, and it may not be known to ATS via any existing configuration. Therefore, a plugin must be used to correct such cases.
Given that there is no general solution, it may be better to configure the ATS behavior in the case when the N+1st redirect has been returned from the origin: Currently ATS returns the redirect response to the origin, but perhaps it would be better in many architectures to respond with a 502 or otherwise reject the request if too many redirects are encountered.