| from wptserve.utils import isomorphic_encode |
| |
| def main(request, response): |
| """Handler that causes multiple redirections. |
| |
| Mandatory parameters: |
| redirect_count - A number which is at least 1 (number of redirects). |
| final_resource - The location of the last redirect. |
| |
| For each number i between 1 and |redirect_count| we have the following optional parameters: |
| tao{{i}} - The Timing-Allow-Origin header of the ith response. Default is no header. |
| origin{{i}} - The origin of the ith redirect (i+1 response). Default is location.origin. |
| Note that the origin of the initial request cannot be controlled here |
| and the Timing-Allow-Origin header of the final response cannot be controlled here. |
| |
| Example: redirect_count=2&final_resource=miau.png&tao1=* |
| |
| Note: |step| is used internally to track the current redirect number. |
| """ |
| step = 1 |
| if b"step" in request.GET: |
| try: |
| step = int(request.GET.first(b"step")) |
| except ValueError: |
| pass |
| |
| redirect_count = int(request.GET.first(b"redirect_count")) |
| final_resource = request.GET.first(b"final_resource") |
| |
| tao_value = None |
| tao = b"tao" + isomorphic_encode(str(step)) |
| if tao in request.GET: |
| tao_value = request.GET.first(tao) |
| |
| redirect_url = b"" |
| origin = b"origin" + isomorphic_encode(str(step)) |
| if origin in request.GET: |
| redirect_url = request.GET.first(origin) |
| |
| if step == redirect_count: |
| redirect_url += final_resource |
| else: |
| redirect_url += b"/element-timing/resources/multiple-redirects.py?" |
| redirect_url += b"redirect_count=" + isomorphic_encode(str(redirect_count)) |
| redirect_url += b"&final_resource=" + final_resource |
| for i in range(1, redirect_count + 1): |
| tao = b"tao" + isomorphic_encode(str(i)) |
| if tao in request.GET: |
| redirect_url += b"&" + tao + b"=" + request.GET.first(tao) |
| origin = b"origin" + isomorphic_encode(str(i)) |
| if origin in request.GET: |
| redirect_url += b"&" + origin + b"=" + request.GET.first(origin) |
| redirect_url += b"&step=" + isomorphic_encode(str(step + 1)) |
| |
| if tao_value: |
| response.headers.set(b"timing-allow-origin", tao_value) |
| |
| response.status = 302 |
| response.headers.set(b"Location", redirect_url) |