| import urllib.parse |
| from wptserve.utils import isomorphic_encode |
| |
| def main(request, response): |
| """Handler that causes multiple redirections. Redirect chain is as follows: |
| 1. Initial URL containing multi-redirect.py |
| 2. Redirect to cross-origin URL |
| 3. Redirect to same-origin URL |
| 4. Final URL containing the final same-origin resource. |
| Mandatory parameters: |
| page_origin - The page origin, used for redirection and to set TAO. This is a mandatory parameter. |
| cross_origin - The cross origin used to make this a cross-origin redirect. This is a mandatory parameter. |
| final_resource - Path of the final resource, without origin. This is a mandatory parameter. |
| Optional parameters: |
| tao_steps - Number of redirects for which the TAO header will be present (a number 0 - 3 makes the most sense). Default value is 0. |
| tao_value - The value of the TAO header, when present. Default value is "*". |
| Note that |step| is a parameter used internally for the multi-redirect. It's the step we're at in the redirect chain. |
| """ |
| step = 1 |
| if b"step" in request.GET: |
| try: |
| step = int(request.GET.first(b"step")) |
| except ValueError: |
| pass |
| |
| page_origin = request.GET.first(b"page_origin") |
| cross_origin = request.GET.first(b"cross_origin") |
| final_resource = request.GET.first(b"final_resource") |
| |
| tao_value = b"*" |
| if b"tao_value" in request.GET: |
| tao_value = request.GET.first(b"tao_value") |
| tao_steps = 0 |
| if b"tao_steps" in request.GET: |
| tao_steps = int(request.GET.first(b"tao_steps")) |
| |
| next_tao_steps = tao_steps - 1 |
| redirect_url_path = b"/resource-timing/resources/multi_redirect.py?" |
| redirect_url_path += b"page_origin=" + page_origin |
| redirect_url_path += b"&cross_origin=" + cross_origin |
| redirect_url_path += b"&final_resource=" + urllib.parse.quote(final_resource).encode('ascii') |
| redirect_url_path += b"&tao_value=" + tao_value |
| redirect_url_path += b"&tao_steps=" + isomorphic_encode(str(next_tao_steps)) |
| redirect_url_path += b"&step=" |
| if tao_steps > 0: |
| response.headers.set(b"timing-allow-origin", tao_value) |
| |
| if step == 1: |
| # On the first request, redirect to a cross origin URL |
| redirect_url = cross_origin + redirect_url_path + b"2" |
| elif step == 2: |
| # On the second request, redirect to a same origin URL |
| redirect_url = page_origin + redirect_url_path + b"3" |
| else: |
| # On the third request, redirect to a static response |
| redirect_url = page_origin + final_resource |
| |
| response.status = 302 |
| response.headers.set(b"Location", redirect_url) |