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)