tor-browser

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

delivering.sjs (2805B)


      1 const CC = Components.Constructor;
      2 const BinaryInputStream = CC(
      3   "@mozilla.org/binaryinputstream;1",
      4   "nsIBinaryInputStream",
      5   "setInputStream"
      6 );
      7 
      8 function handleRequest(aRequest, aResponse) {
      9   var params = new URLSearchParams(aRequest.queryString);
     10 
     11   // Report-to setter
     12   if (aRequest.method == "GET" && params.get("task") == "header") {
     13     let extraParams = [];
     14 
     15     if (params.has("410")) {
     16       extraParams.push("410=true");
     17     }
     18 
     19     if (params.has("worker")) {
     20       extraParams.push("worker=true");
     21     }
     22 
     23     let body = {
     24       max_age: 1,
     25       endpoints: [
     26         {
     27           url:
     28             "https://example.org/tests/dom/reporting/tests/delivering.sjs" +
     29             (extraParams.length ? "?" + extraParams.join("&") : ""),
     30           priority: 1,
     31           weight: 1,
     32         },
     33       ],
     34     };
     35 
     36     aResponse.setStatusLine(aRequest.httpVersion, 200, "OK");
     37     aResponse.setHeader("Report-to", JSON.stringify(body), false);
     38     aResponse.write("OK");
     39     return;
     40   }
     41 
     42   // Report check
     43   if (aRequest.method == "GET" && params.get("task") == "check") {
     44     aResponse.setStatusLine(aRequest.httpVersion, 200, "OK");
     45 
     46     let reports = getState("report");
     47     if (!reports) {
     48       aResponse.write("");
     49       return;
     50     }
     51 
     52     if (params.has("min")) {
     53       let json = JSON.parse(reports);
     54       if (json.length < params.get("min")) {
     55         aResponse.write("");
     56         return;
     57       }
     58     }
     59 
     60     aResponse.setStatusLine(aRequest.httpVersion, 200, "OK");
     61     aResponse.write(getState("report"));
     62 
     63     setState("report", "");
     64     return;
     65   }
     66 
     67   if (aRequest.method == "POST") {
     68     var body = new BinaryInputStream(aRequest.bodyInputStream);
     69 
     70     var avail;
     71     var bytes = [];
     72     while ((avail = body.available()) > 0) {
     73       Array.prototype.push.apply(bytes, body.readByteArray(avail));
     74     }
     75 
     76     let reports = getState("report");
     77     if (!reports) {
     78       reports = [];
     79     } else {
     80       reports = JSON.parse(reports);
     81     }
     82 
     83     const incoming_reports = JSON.parse(String.fromCharCode.apply(null, bytes));
     84     for (let report of incoming_reports) {
     85       let data = {
     86         contentType: aRequest.getHeader("content-type"),
     87         origin: aRequest.getHeader("origin"),
     88         body: report,
     89         url:
     90           aRequest.scheme +
     91           "://" +
     92           aRequest.host +
     93           aRequest.path +
     94           (aRequest.queryString ? "&" + aRequest.queryString : ""),
     95       };
     96       reports.push(data);
     97     }
     98 
     99     setState("report", JSON.stringify(reports));
    100 
    101     if (params.has("410")) {
    102       aResponse.setStatusLine(aRequest.httpVersion, 410, "Gone");
    103     } else {
    104       aResponse.setStatusLine(aRequest.httpVersion, 200, "OK");
    105     }
    106     return;
    107   }
    108 
    109   aResponse.setStatusLine(aRequest.httpVersion, 500, "Internal error");
    110   aResponse.write("Invalid request");
    111 }