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 }