| from urllib.parse import unquote |
| |
| from wptserve.utils import isomorphic_decode, isomorphic_encode |
| |
| def redirect_response(request, response, visited_count): |
| # |visited_count| is used as a unique id to differentiate responses |
| # every time. |
| location = b'empty.js' |
| if b'Redirect' in request.GET: |
| location = isomorphic_encode(unquote(isomorphic_decode(request.GET[b'Redirect']))) |
| return (301, |
| [ |
| (b'Cache-Control', b'no-cache, must-revalidate'), |
| (b'Pragma', b'no-cache'), |
| (b'Content-Type', b'application/javascript'), |
| (b'Location', location), |
| ], |
| u'/* %s */' % str(visited_count)) |
| |
| def not_found_response(): |
| return 404, [(b'Content-Type', b'text/plain')], u"Page not found" |
| |
| def ok_response(request, response, visited_count, |
| extra_body=u'', mime_type=b'application/javascript'): |
| # |visited_count| is used as a unique id to differentiate responses |
| # every time. |
| return ( |
| [ |
| (b'Cache-Control', b'no-cache, must-revalidate'), |
| (b'Pragma', b'no-cache'), |
| (b'Content-Type', mime_type) |
| ], |
| u'/* %s */ %s' % (str(visited_count), extra_body)) |
| |
| def main(request, response): |
| key = request.GET[b"Key"] |
| mode = request.GET[b"Mode"] |
| |
| visited_count = request.server.stash.take(key) |
| if visited_count is None: |
| visited_count = 0 |
| |
| # Keep how many times the test requested this resource. |
| visited_count += 1 |
| request.server.stash.put(key, visited_count) |
| |
| # Return a response based on |mode| only when it's the second time (== update). |
| if visited_count == 2: |
| if mode == b'normal': |
| return ok_response(request, response, visited_count) |
| if mode == b'bad_mime_type': |
| return ok_response(request, response, visited_count, mime_type=b'text/html') |
| if mode == b'not_found': |
| return not_found_response() |
| if mode == b'redirect': |
| return redirect_response(request, response, visited_count) |
| if mode == b'syntax_error': |
| return ok_response(request, response, visited_count, extra_body=u'badsyntax(isbad;') |
| if mode == b'throw_install': |
| return ok_response(request, response, visited_count, extra_body=u"addEventListener('install', function(e) { throw new Error('boom'); });") |
| |
| return ok_response(request, response, visited_count) |