file_server.sjs (3650B)
1 const { NetUtil } = ChromeUtils.importESModule( 2 "resource://gre/modules/NetUtil.sys.mjs" 3 ); 4 5 function ERR(response, msg) { 6 dump("ERROR: " + msg + "\n"); 7 response.write("HTTP/1.1 400 Bad Request\r\n"); 8 response.write("Content-Type: text/html; charset=UTF-8\r\n"); 9 response.write("Content-Length: " + msg.length + "\r\n"); 10 response.write("\r\n"); 11 response.write(msg); 12 } 13 14 function loadContentFromFile(path) { 15 // Load the content to return in the response from file. 16 // Since it's relative to the cwd of the test runner, we start there and 17 // append to get to the actual path of the file. 18 var testContentFile = Cc["@mozilla.org/file/directory_service;1"] 19 .getService(Ci.nsIProperties) 20 .get("CurWorkD", Ci.nsIFile); 21 var dirs = path.split("/"); 22 for (var i = 0; i < dirs.length; i++) { 23 testContentFile.append(dirs[i]); 24 } 25 var testContentFileStream = Cc[ 26 "@mozilla.org/network/file-input-stream;1" 27 ].createInstance(Ci.nsIFileInputStream); 28 testContentFileStream.init(testContentFile, -1, 0, 0); 29 var testContent = NetUtil.readInputStreamToString( 30 testContentFileStream, 31 testContentFileStream.available() 32 ); 33 return testContent; 34 } 35 36 function handleRequest(request, response) { 37 const { scheme, host, path } = request; 38 // get the Content-Type to serve from the query string 39 var contentType = null; 40 var uniqueID = null; 41 var showLastRequest = false; 42 request.queryString.split("&").forEach(function (val) { 43 var [name, value] = val.split("="); 44 if (name == "type") { 45 contentType = unescape(value); 46 } 47 if (name == "uniqueID") { 48 uniqueID = unescape(value); 49 } 50 if (name == "lastRequest") { 51 showLastRequest = true; 52 } 53 }); 54 55 // avoid confusing cache behaviors 56 response.setHeader("Cache-Control", "no-cache", false); 57 58 if (showLastRequest) { 59 response.setHeader("Content-Type", "text/html", false); 60 61 // We don't want to expose the same lastRequest multiple times. 62 var state = getState("lastRequest"); 63 setState("lastRequest", ""); 64 65 if (state == "") { 66 ERR(response, "No last request!"); 67 return; 68 } 69 70 response.write(state); 71 return; 72 } 73 74 if (!uniqueID) { 75 ERR(response, "No uniqueID?!?"); 76 return; 77 } 78 79 setState( 80 "lastRequest", 81 JSON.stringify({ 82 scheme, 83 host, 84 path, 85 uniqueID, 86 contentType: contentType || "other", 87 }) 88 ); 89 90 switch (contentType) { 91 case "img": 92 response.setHeader("Content-Type", "image/png", false); 93 response.write( 94 loadContentFromFile("tests/image/test/mochitest/blue.png") 95 ); 96 break; 97 98 case "media": 99 response.setHeader("Content-Type", "video/webm", false); 100 response.write(loadContentFromFile("tests/dom/media/test/vp9.webm")); 101 break; 102 103 case "iframe": 104 response.setHeader("Content-Type", "text/html", false); 105 response.write("frame content"); 106 break; 107 108 case "script": 109 response.setHeader("Content-Type", "application/javascript", false); 110 break; 111 112 case "stylesheet": 113 response.setHeader("Content-Type", "text/css", false); 114 break; 115 116 case "object": 117 response.setHeader("Content-Type", "application/x-test-match", false); 118 break; 119 120 case "xhr": 121 response.setHeader("Content-Type", "text/xml", false); 122 response.setHeader("Access-Control-Allow-Origin", "https://example.com"); 123 response.write('<?xml version="1.0" encoding="UTF-8" ?><test></test>'); 124 break; 125 126 default: 127 response.setHeader("Content-Type", "text/html", false); 128 response.write("<html><body>Hello World</body></html>"); 129 break; 130 } 131 }