tor-browser

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

form_submit_server.sjs (2357B)


      1 const CC = Components.Constructor;
      2 const BinaryInputStream = CC(
      3   "@mozilla.org/binaryinputstream;1",
      4   "nsIBinaryInputStream",
      5   "setInputStream"
      6 );
      7 
      8 function utf8decode(s) {
      9   return decodeURIComponent(escape(s));
     10 }
     11 
     12 function utf8encode(s) {
     13   return unescape(encodeURIComponent(s));
     14 }
     15 
     16 function handleRequest(request, response) {
     17   var bodyStream = new BinaryInputStream(request.bodyInputStream);
     18   var result = [];
     19   var requestBody = "";
     20   while ((bodyAvail = bodyStream.available()) > 0) {
     21     requestBody += bodyStream.readBytes(bodyAvail);
     22   }
     23 
     24   if (request.method == "POST") {
     25     var contentTypeParams = {};
     26     request
     27       .getHeader("Content-Type")
     28       .split(/\s*\;\s*/)
     29       .forEach(function (s) {
     30         if (s.indexOf("=") >= 0) {
     31           let [name, value] = s.split("=");
     32           contentTypeParams[name] = value;
     33         } else {
     34           contentTypeParams[""] = s;
     35         }
     36       });
     37 
     38     if (
     39       contentTypeParams[""] == "multipart/form-data" &&
     40       request.queryString == ""
     41     ) {
     42       requestBody
     43         .split("--" + contentTypeParams.boundary)
     44         .slice(1, -1)
     45         .forEach(function (s) {
     46           let headers = {};
     47           let headerEnd = s.indexOf("\r\n\r\n");
     48           s.substr(2, headerEnd - 2)
     49             .split("\r\n")
     50             .forEach(function (str) {
     51               // We're assuming UTF8 for now
     52               let [name, value] = str.split(": ");
     53               headers[name] = utf8decode(value);
     54             });
     55 
     56           let body = s.substring(headerEnd + 4, s.length - 2);
     57           if (
     58             !headers["Content-Type"] ||
     59             headers["Content-Type"] == "text/plain"
     60           ) {
     61             // We're assuming UTF8 for now
     62             body = utf8decode(body);
     63           }
     64           result.push({ headers, body });
     65         });
     66     }
     67     if (
     68       contentTypeParams[""] == "text/plain" &&
     69       request.queryString == "plain"
     70     ) {
     71       result = utf8decode(requestBody);
     72     }
     73     if (
     74       contentTypeParams[""] == "application/x-www-form-urlencoded" &&
     75       request.queryString == "url"
     76     ) {
     77       result = requestBody;
     78     }
     79   } else if (request.method == "GET") {
     80     result = request.queryString;
     81   }
     82 
     83   // Send response body
     84   response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
     85   response.write(utf8encode(JSON.stringify(result)));
     86 }