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)