From 32d9c8ba9005dacab242ffe32891872f778c3bc4 Mon Sep 17 00:00:00 2001 From: lohxt1 Date: Tue, 28 May 2024 16:17:50 +0530 Subject: [PATCH] fix(#2367): handle response body decode --- packages/bruno-electron/package.json | 1 + packages/bruno-electron/src/ipc/network/index.js | 10 ++++++++-- packages/bruno-tests/src/echo/index.js | 6 ++++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/packages/bruno-electron/package.json b/packages/bruno-electron/package.json index 5d47141236..4898d4a220 100644 --- a/packages/bruno-electron/package.json +++ b/packages/bruno-electron/package.json @@ -41,6 +41,7 @@ "graphql": "^16.6.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.2", + "iconv-lite": "^0.6.3", "is-valid-path": "^0.1.1", "js-yaml": "^4.1.0", "json-bigint": "^1.0.0", diff --git a/packages/bruno-electron/src/ipc/network/index.js b/packages/bruno-electron/src/ipc/network/index.js index a74584461a..5d2e002308 100644 --- a/packages/bruno-electron/src/ipc/network/index.js +++ b/packages/bruno-electron/src/ipc/network/index.js @@ -37,6 +37,7 @@ const { transformPasswordCredentialsRequest } = require('./oauth2-helper'); const Oauth2Store = require('../../store/oauth2'); +const iconv = require('iconv-lite'); // override the default escape function to prevent escaping Mustache.escape = function (value) { @@ -258,13 +259,18 @@ const configureRequest = async ( }; const parseDataFromResponse = (response) => { - const dataBuffer = Buffer.from(response.data); // Parse the charset from content type: https://stackoverflow.com/a/33192813 const charsetMatch = /charset=([^()<>@,;:"/[\]?.=\s]*)/i.exec(response.headers['content-type'] || ''); // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/exec#using_exec_with_regexp_literals const charsetValue = charsetMatch?.[1]; + const dataBuffer = Buffer.from(response.data); // Overwrite the original data for backwards compatibility - let data = dataBuffer.toString(charsetValue || 'utf-8'); + let data; + if (iconv.encodingExists(charsetValue)) { + data = iconv.decode(dataBuffer, charsetValue); + } else { + data = iconv.decode(dataBuffer, 'utf-8'); + } // Try to parse response to JSON, this can quietly fail try { // Filter out ZWNBSP character diff --git a/packages/bruno-tests/src/echo/index.js b/packages/bruno-tests/src/echo/index.js index 2a2b52eb3f..ba9b403ae3 100644 --- a/packages/bruno-tests/src/echo/index.js +++ b/packages/bruno-tests/src/echo/index.js @@ -31,4 +31,10 @@ router.get('/bom-json-test', (req, res) => { return res.send(jsonWithBom); }); +router.get('/iso-enc', (req, res) => { + res.set('Content-Type', 'text/plain; charset=ISO-8859-1'); + const responseText = 'éçà'; + return res.send(Buffer.from(responseText, 'latin1')); +}); + module.exports = router;