sjs_network-observer-test-server.sjs (7211B)
1 /* Any copyright is dedicated to the Public Domain. 2 http://creativecommons.org/publicdomain/zero/1.0/ */ 3 4 "use strict"; 5 6 // Simple server which can handle several response types and states. 7 // Trimmed down from devtools/client/netmonitor/test/sjs_content-type-test-server.sjs 8 // Additional features can be ported if needed. 9 function handleRequest(request, response) { 10 response.processAsync(); 11 12 const params = request.queryString.split("&"); 13 const format = (params.filter(s => s.includes("fmt="))[0] || "").split( 14 "=" 15 )[1]; 16 const status = 17 (params.filter(s => s.includes("sts="))[0] || "").split("=")[1] || 200; 18 19 const cacheExpire = 60; // seconds 20 21 function setCacheHeaders() { 22 if (status != 304) { 23 response.setHeader( 24 "Cache-Control", 25 "no-cache, no-store, must-revalidate" 26 ); 27 response.setHeader("Pragma", "no-cache"); 28 response.setHeader("Expires", "0"); 29 return; 30 } 31 32 response.setHeader("Expires", Date(Date.now() + cacheExpire * 1000), false); 33 } 34 35 const allowCORS = params.some(s => s.startsWith("cors")); 36 function setCORSHeader() { 37 if (allowCORS) { 38 response.setHeader("Access-Control-Allow-Origin", "*", false); 39 } 40 } 41 42 let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); 43 44 timer.initWithCallback( 45 // eslint-disable-next-line complexity 46 () => { 47 // to avoid garbage collection 48 timer = null; 49 switch (format) { 50 case "txt": { 51 response.setStatusLine(request.httpVersion, status, "DA DA DA"); 52 response.setHeader("Content-Type", "text/plain", false); 53 setCacheHeaders(); 54 55 function convertToUtf8(str) { 56 return String.fromCharCode(...new TextEncoder().encode(str)); 57 } 58 59 // This script must be evaluated as UTF-8 for this to write out the 60 // bytes of the string in UTF-8. If it's evaluated as Latin-1, the 61 // written bytes will be the result of UTF-8-encoding this string 62 // *twice*. 63 const data = "Братан, ты вообще качаешься?"; 64 const stringOfUtf8Bytes = convertToUtf8(data); 65 response.write(stringOfUtf8Bytes); 66 67 response.finish(); 68 break; 69 } 70 case "xml": { 71 response.setStatusLine(request.httpVersion, status, "OK"); 72 response.setHeader("Content-Type", "text/xml; charset=utf-8", false); 73 setCacheHeaders(); 74 response.write("<label value='greeting'>Hello XML!</label>"); 75 response.finish(); 76 break; 77 } 78 case "html": { 79 const content = ( 80 params.filter(s => s.includes("res="))[0] || "" 81 ).split("=")[1]; 82 response.setStatusLine(request.httpVersion, status, "OK"); 83 response.setHeader("Content-Type", "text/html; charset=utf-8", false); 84 setCacheHeaders(); 85 setCORSHeader(); 86 response.write(content || "<p>Hello HTML!</p>"); 87 response.finish(); 88 break; 89 } 90 case "xhtml": { 91 response.setStatusLine(request.httpVersion, status, "OK"); 92 response.setHeader( 93 "Content-Type", 94 "application/xhtml+xml; charset=utf-8", 95 false 96 ); 97 setCacheHeaders(); 98 setCORSHeader(); 99 response.write("<p>Hello XHTML!</p>"); 100 response.finish(); 101 break; 102 } 103 case "html-long": { 104 const str = new Array(102400 /* 100 KB in bytes */).join("."); 105 response.setStatusLine(request.httpVersion, status, "OK"); 106 response.setHeader("Content-Type", "text/html; charset=utf-8", false); 107 setCacheHeaders(); 108 setCORSHeader(); 109 response.write("<p>" + str + "</p>"); 110 response.finish(); 111 break; 112 } 113 case "css": { 114 response.setStatusLine(request.httpVersion, status, "OK"); 115 response.setHeader("Content-Type", "text/css; charset=utf-8", false); 116 setCacheHeaders(); 117 setCORSHeader(); 118 response.write("body:pre { content: 'Hello CSS!' }"); 119 response.finish(); 120 break; 121 } 122 case "js": { 123 response.setStatusLine(request.httpVersion, status, "OK"); 124 response.setHeader( 125 "Content-Type", 126 "application/javascript; charset=utf-8", 127 false 128 ); 129 setCacheHeaders(); 130 setCORSHeader(); 131 response.write("function() { return 'Hello JS!'; }"); 132 response.finish(); 133 break; 134 } 135 case "json": { 136 response.setStatusLine(request.httpVersion, status, "OK"); 137 response.setHeader( 138 "Content-Type", 139 "application/json; charset=utf-8", 140 false 141 ); 142 setCacheHeaders(); 143 setCORSHeader(); 144 response.write('{ "greeting": "Hello JSON!" }'); 145 response.finish(); 146 break; 147 } 148 149 case "font": { 150 response.setStatusLine(request.httpVersion, status, "OK"); 151 response.setHeader("Content-Type", "font/woff", false); 152 setCacheHeaders(); 153 setCORSHeader(); 154 response.finish(); 155 break; 156 } 157 case "image": { 158 response.setStatusLine(request.httpVersion, status, "OK"); 159 response.setHeader("Content-Type", "image/png", false); 160 setCacheHeaders(); 161 setCORSHeader(); 162 response.finish(); 163 break; 164 } 165 case "application-ogg": { 166 response.setStatusLine(request.httpVersion, status, "OK"); 167 response.setHeader("Content-Type", "application/ogg", false); 168 setCacheHeaders(); 169 setCORSHeader(); 170 response.finish(); 171 break; 172 } 173 case "audio": { 174 response.setStatusLine(request.httpVersion, status, "OK"); 175 response.setHeader("Content-Type", "audio/ogg", false); 176 setCacheHeaders(); 177 setCORSHeader(); 178 response.finish(); 179 break; 180 } 181 case "video": { 182 response.setStatusLine(request.httpVersion, status, "OK"); 183 response.setHeader("Content-Type", "video/webm", false); 184 setCacheHeaders(); 185 setCORSHeader(); 186 response.finish(); 187 break; 188 } 189 case "ws": { 190 response.setStatusLine( 191 request.httpVersion, 192 101, 193 "Switching Protocols" 194 ); 195 response.setHeader("Connection", "upgrade", false); 196 response.setHeader("Upgrade", "websocket", false); 197 setCacheHeaders(); 198 setCORSHeader(); 199 response.finish(); 200 break; 201 } 202 default: { 203 response.setStatusLine(request.httpVersion, 404, "Not Found"); 204 response.setHeader("Content-Type", "text/html; charset=utf-8", false); 205 setCacheHeaders(); 206 setCORSHeader(); 207 response.write("<blink>Not Found</blink>"); 208 response.finish(); 209 break; 210 } 211 } 212 }, 213 10, 214 Ci.nsITimer.TYPE_ONE_SHOT 215 ); // Make sure this request takes a few ms. 216 }