tor-browser

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

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 }