tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

SyntheticResponse.py (1792B)


      1 from urllib.parse import unquote
      2 
      3 from wptserve.utils import isomorphic_decode, isomorphic_encode
      4 
      5 import importlib
      6 sleep = importlib.import_module("resource-timing.sleep")
      7 
      8 def main(request, response):
      9    index = isomorphic_encode(request.request_path).index(b"?")
     10    args = isomorphic_encode(request.request_path[index+1:]).split(b"&")
     11    headers = []
     12    statusSent = False
     13    headersSent = False
     14    for arg in args:
     15        if arg.startswith(b"ignored"):
     16            continue
     17        elif arg.endswith(b"ms"):
     18            sleep.sleep_at_least(float(arg[0:-2]))
     19        elif arg.startswith(b"redirect:"):
     20            return (302, u"WEBPERF MARKETING"), [(b"Location", unquote(isomorphic_decode(arg[9:])))], u"TEST"
     21 
     22        elif arg.startswith(b"mime:"):
     23            headers.append((b"Content-Type", unquote(isomorphic_decode(arg[5:]))))
     24 
     25        elif arg.startswith(b"send:"):
     26            text = unquote(isomorphic_decode(arg[5:]))
     27 
     28            if not statusSent:
     29                # Default to a 200 status code.
     30                response.writer.write_status(200)
     31                statusSent = True
     32            if not headersSent:
     33                for key, value in headers:
     34                    response.writer.write_header(key, value)
     35                response.writer.end_headers()
     36                headersSent = True
     37 
     38            response.writer.write_content(text)
     39        elif arg.startswith(b"status:"):
     40            code = int(unquote(isomorphic_decode(arg[7:])))
     41            response.writer.write_status(code)
     42            if code // 100 == 1:
     43                # Terminate informational 1XX responses with an empty line.
     44                response.writer.end_headers()
     45            else:
     46                statusSent = True
     47 
     48 #        else:
     49 #            error "  INVALID ARGUMENT %s" % arg