record-header.py (5344B)
1 import os 2 import hashlib 3 import json 4 5 from wptserve.utils import isomorphic_decode 6 7 def main(request, response): 8 ## Get the query parameter (key) from URL ## 9 ## Tests will record POST requests (CSP Report) and GET (rest) ## 10 if request.GET: 11 key = request.GET[b'file'] 12 elif request.POST: 13 key = request.POST[b'file'] 14 15 ## Convert the key from String to UUID valid String ## 16 testId = hashlib.md5(key).hexdigest() 17 18 ## Handle the header retrieval request ## 19 if b'retrieve' in request.GET: 20 response.writer.write_status(200) 21 response.writer.write_header(b"Connection", b"close") 22 response.writer.end_headers() 23 try: 24 header_value = request.server.stash.take(testId) 25 response.writer.write(header_value) 26 except (KeyError, ValueError) as e: 27 response.writer.write(u"No header has been recorded") 28 pass 29 30 response.close_connection = True 31 32 ## Record incoming fetch metadata header value 33 else: 34 try: 35 ## Return a serialized JSON object with one member per header. If the ## 36 ## header isn't present, the member will contain an empty string. ## 37 header = json.dumps({ 38 u"dest": isomorphic_decode(request.headers.get(b"sec-fetch-dest", b"")), 39 u"mode": isomorphic_decode(request.headers.get(b"sec-fetch-mode", b"")), 40 u"site": isomorphic_decode(request.headers.get(b"sec-fetch-site", b"")), 41 u"user": isomorphic_decode(request.headers.get(b"sec-fetch-user", b"")), 42 }) 43 request.server.stash.put(testId, header) 44 except KeyError: 45 ## The header is already recorded or it doesn't exist 46 pass 47 48 ## Prevent the browser from caching returned responses and allow CORS ## 49 response.headers.set(b"Access-Control-Allow-Origin", b"*") 50 response.headers.set(b"Cache-Control", b"no-cache, no-store, must-revalidate") 51 response.headers.set(b"Pragma", b"no-cache") 52 response.headers.set(b"Expires", b"0") 53 54 ## Add a valid ServiceWorker Content-Type ## 55 if key.startswith(b"serviceworker"): 56 response.headers.set(b"Content-Type", b"application/javascript") 57 58 ## Add a valid image Content-Type ## 59 if key.startswith(b"image"): 60 response.headers.set(b"Content-Type", b"image/png") 61 file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb") 62 image = file.read() 63 file.close() 64 return image 65 66 ## Return a valid .vtt content for the <track> tag ## 67 if key.startswith(b"track"): 68 return b"WEBVTT" 69 70 ## Return a valid SharedWorker ## 71 if key.startswith(b"sharedworker"): 72 response.headers.set(b"Content-Type", b"application/javascript") 73 file = open(os.path.join(request.doc_root, u"fetch", u"metadata", 74 u"resources", u"sharedWorker.js"), u"rb") 75 shared_worker = file.read() 76 file.close() 77 return shared_worker 78 79 ## Return a valid font content and Content-Type ## 80 if key.startswith(b"font"): 81 response.headers.set(b"Content-Type", b"application/x-font-ttf") 82 file = open(os.path.join(request.doc_root, u"fonts", u"Ahem.ttf"), u"rb") 83 font = file.read() 84 file.close() 85 return font 86 87 ## Return a valid audio content and Content-Type ## 88 if key.startswith(b"audio"): 89 response.headers.set(b"Content-Type", b"audio/mpeg") 90 file = open(os.path.join(request.doc_root, u"media", u"sound_5.mp3"), u"rb") 91 audio = file.read() 92 file.close() 93 return audio 94 95 ## Return a valid video content and Content-Type ## 96 if key.startswith(b"video"): 97 response.headers.set(b"Content-Type", b"video/mp4") 98 file = open(os.path.join(request.doc_root, u"media", u"A4.mp4"), u"rb") 99 video = file.read() 100 file.close() 101 return video 102 103 ## Return valid style content and Content-Type ## 104 if key.startswith(b"style"): 105 response.headers.set(b"Content-Type", b"text/css") 106 return b"div { }" 107 108 ## Return a valid embed/object content and Content-Type ## 109 if key.startswith(b"embed") or key.startswith(b"object"): 110 response.headers.set(b"Content-Type", b"text/html") 111 return b"<html>EMBED!</html>" 112 113 ## Return a valid image content and Content-Type for redirect requests ## 114 if key.startswith(b"redirect"): 115 response.headers.set(b"Content-Type", b"image/jpeg") 116 file = open(os.path.join(request.doc_root, u"media", u"1x1-green.png"), u"rb") 117 image = file.read() 118 file.close() 119 return image 120 121 ## Return a valid dedicated worker 122 if key.startswith(b"worker"): 123 response.headers.set(b"Content-Type", b"application/javascript") 124 return b"self.postMessage('loaded');" 125 126 ## Return a valid worklet 127 if key.startswith(b"worklet"): 128 response.headers.set(b"Content-Type", b"application/javascript") 129 return b"" 130 131 ## Return a valid XSLT 132 if key.startswith(b"xslt"): 133 response.headers.set(b"Content-Type", b"text/xsl") 134 return b"""<?xml version="1.0" encoding="UTF-8"?> 135 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 136 <xsl:template match="@*|node()"> 137 <xsl:copy> 138 <xsl:apply-templates select="@*|node()"/> 139 </xsl:copy> 140 </xsl:template> 141 </xsl:stylesheet>""" 142 143 if key.startswith(b"script"): 144 response.headers.set(b"Content-Type", b"application/javascript") 145 return b"void 0;"