tor-browser

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

early-hints-test-loader.h2.py (2133B)


      1 # An HTTP/2 handler for testing Early Hints. Used as an entry point of Early
      2 # Hints related tests to inject Early Hints response. See comments in
      3 # `early-hints-helpers.sub.js`.
      4 
      5 import json
      6 import os
      7 import time
      8 
      9 
     10 def _remove_relative_resources_prefix(path):
     11    if path.startswith("resources/"):
     12        return path[len("resources/"):]
     13    return path
     14 
     15 
     16 def handle_headers(frame, request, response):
     17    preload_headers = []
     18    for encoded_preload in request.GET.get_list(b"preloads"):
     19        preload = json.loads(encoded_preload.decode("utf-8"))
     20        header = "<{}>; rel=preload; as={}".format(preload["url"], preload["as_attr"])
     21        if "crossorigin_attr" in preload:
     22            crossorigin = preload["crossorigin_attr"]
     23            if crossorigin:
     24                header += "; crossorigin={}".format(crossorigin)
     25            else:
     26                header += "; crossorigin"
     27        if "fetchpriority_attr" in preload:
     28            fetchpriority = preload["fetchpriority_attr"]
     29            if fetchpriority:
     30                header += "; fetchpriority={}".format(fetchpriority)
     31        preload_headers.append(header.encode())
     32 
     33    # Send a 103 response.
     34    early_hints = [(b":status", b"103")]
     35    for header in preload_headers:
     36        early_hints.append((b"link", header))
     37    response.writer.write_raw_header_frame(headers=early_hints,
     38                                           end_headers=True)
     39 
     40    # Simulate the response generation is taking time.
     41    time.sleep(0.2)
     42    response.status = 200
     43    response.headers[b"content-type"] = "text/html"
     44    if request.GET[b"exclude_preloads_from_ok_response"].decode("utf-8") != "true":
     45        for header in preload_headers:
     46            response.headers.append(b"link", header)
     47    response.write_status_headers()
     48 
     49 
     50 def main(request, response):
     51    test_path = _remove_relative_resources_prefix(
     52        request.GET[b"test_url"].decode("utf-8"))
     53    current_dir = os.path.dirname(os.path.realpath(__file__))
     54    file_path = os.path.join(current_dir, test_path)
     55    test_content = open(file_path, "r").read()
     56    response.writer.write_data(item=test_content, last=True)