From d251dae286eca9eada9133fff9bdbaeb91ac22f9 Mon Sep 17 00:00:00 2001 From: George Stagg Date: Wed, 7 Sep 2022 13:04:38 +0100 Subject: [PATCH] Populate XHR response property with binary data --- lib/XMLHttpRequest.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/lib/XMLHttpRequest.js b/lib/XMLHttpRequest.js index bada957..cacada8 100644 --- a/lib/XMLHttpRequest.js +++ b/lib/XMLHttpRequest.js @@ -109,6 +109,7 @@ exports.XMLHttpRequest = function() { // Result & response this.responseText = ""; this.responseXML = ""; + this.response = Buffer.alloc(0); this.status = null; this.statusText = null; @@ -429,7 +430,7 @@ exports.XMLHttpRequest = function() { return; } - response.setEncoding("utf8"); + response.setEncoding('binary'); setState(self.HEADERS_RECEIVED); self.status = response.statusCode; @@ -437,7 +438,9 @@ exports.XMLHttpRequest = function() { response.on("data", function(chunk) { // Make sure there's some data if (chunk) { - self.responseText += chunk; + var data = Buffer.from(chunk, 'binary'); + self.responseText += data.toString('utf8'); + self.response = Buffer.concat([self.response, data]); } // Don't emit state changes if the connection has been aborted. if (sendFlag) { @@ -484,13 +487,16 @@ exports.XMLHttpRequest = function() { + "var doRequest = http" + (ssl ? "s" : "") + ".request;" + "var options = " + JSON.stringify(options) + ";" + "var responseText = '';" + + "var responseData = Buffer.alloc(0);" + "var req = doRequest(options, function(response) {" - + "response.setEncoding('utf8');" + + "response.setEncoding('binary');" + "response.on('data', function(chunk) {" - + " responseText += chunk;" + + " var data = Buffer.from(chunk, 'binary');" + + " responseText += data.toString('utf8');" + + " responseData = Buffer.concat([responseData, data]);" + "});" + "response.on('end', function() {" - + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText}}), 'utf8');" + + "fs.writeFileSync('" + contentFile + "', JSON.stringify({err: null, data: {statusCode: response.statusCode, headers: response.headers, text: responseText, data: responseData.toString('base64')}}), 'utf8');" + "fs.unlinkSync('" + syncFile + "');" + "});" + "response.on('error', function(error) {" @@ -520,6 +526,7 @@ exports.XMLHttpRequest = function() { response = resp.data; self.status = resp.data.statusCode; self.responseText = resp.data.text; + self.response = Buffer.from(resp.data.data, 'base64'); setState(self.DONE); } }