tor-browser

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

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 }