Fix Google translate result decoding Inspired by #2522

ded26f978399f66f3ca50424089d923e7dd8171d

Cohee <18619528+Cohee1207@users.noreply.github.com>

3 files changed, +36 -7Showing whitespace changes
package-lock.json+29 -4
@@ -27,6 +27,7 @@
27 "google-translate-api-browser": "^3.0.1",27 "google-translate-api-browser": "^3.0.1",
28 "he": "^1.2.0",28 "he": "^1.2.0",
29 "helmet": "^7.1.0",29 "helmet": "^7.1.0",
30 "iconv-lite": "^0.6.3",
30 "ip-matching": "^2.1.2",31 "ip-matching": "^2.1.2",
31 "ipaddr.js": "^2.0.1",32 "ipaddr.js": "^2.0.1",
32 "jimp": "^0.22.10",33 "jimp": "^0.22.10",
@@ -1492,6 +1493,18 @@
1492 "node": ">= 0.8"1493 "node": ">= 0.8"
1493 }1494 }
1494 },1495 },
1496 "node_modules/body-parser/node_modules/iconv-lite": {
1497 "version": "0.4.24",
1498 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1499 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1500 "license": "MIT",
1501 "dependencies": {
1502 "safer-buffer": ">= 2.1.2 < 3"
1503 },
1504 "engines": {
1505 "node": ">=0.10.0"
1506 }
1507 },
1495 "node_modules/boolbase": {1508 "node_modules/boolbase": {
1496 "version": "1.0.0",1509 "version": "1.0.0",
1497 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",1510 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
@@ -3282,12 +3295,12 @@
3282 }3295 }
3283 },3296 },
3284 "node_modules/iconv-lite": {3297 "node_modules/iconv-lite": {
3285 "version": "0.4.24",3298 "version": "0.6.3",
3286 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",3299 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
3287 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",3300 "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
3288 "license": "MIT",3301 "license": "MIT",
3289 "dependencies": {3302 "dependencies": {
3290 "safer-buffer": ">= 2.1.2 < 3"3303 "safer-buffer": ">= 2.1.2 < 3.0.0"
3291 },3304 },
3292 "engines": {3305 "engines": {
3293 "node": ">=0.10.0"3306 "node": ">=0.10.0"
@@ -4618,6 +4631,18 @@
4618 "node": ">= 0.8"4631 "node": ">= 0.8"
4619 }4632 }
4620 },4633 },
4634 "node_modules/raw-body/node_modules/iconv-lite": {
4635 "version": "0.4.24",
4636 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
4637 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
4638 "license": "MIT",
4639 "dependencies": {
4640 "safer-buffer": ">= 2.1.2 < 3"
4641 },
4642 "engines": {
4643 "node": ">=0.10.0"
4644 }
4645 },
4621 "node_modules/readable-stream": {4646 "node_modules/readable-stream": {
4622 "version": "2.3.8",4647 "version": "2.3.8",
4623 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",4648 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
package.json+1 -0
@@ -17,6 +17,7 @@
17 "google-translate-api-browser": "^3.0.1",17 "google-translate-api-browser": "^3.0.1",
18 "he": "^1.2.0",18 "he": "^1.2.0",
19 "helmet": "^7.1.0",19 "helmet": "^7.1.0",
20 "iconv-lite": "^0.6.3",
20 "ip-matching": "^2.1.2",21 "ip-matching": "^2.1.2",
21 "ipaddr.js": "^2.0.1",22 "ipaddr.js": "^2.0.1",
22 "jimp": "^0.22.10",23 "jimp": "^0.22.10",
src/endpoints/translate.js+6 -3
@@ -1,6 +1,7 @@
1const fetch = require('node-fetch').default;1const fetch = require('node-fetch').default;
2const https = require('https');2const https = require('https');
3const express = require('express');3const express = require('express');
4const iconv = require('iconv-lite');
4const { readSecret, SECRET_KEYS } = require('./secrets');5const { readSecret, SECRET_KEYS } = require('./secrets');
5const { getConfigValue, uuidv4 } = require('../util');6const { getConfigValue, uuidv4 } = require('../util');
6const { jsonParser } = require('../express-common');7const { jsonParser } = require('../express-common');
@@ -80,16 +81,18 @@ router.post('/google', jsonParser, async (request, response) => {
80 const url = generateRequestUrl(text, { to: lang });81 const url = generateRequestUrl(text, { to: lang });
8182
82 https.get(url, (resp) => {83 https.get(url, (resp) => {
83 let data = '';84 const data = [];
8485
85 resp.on('data', (chunk) => {86 resp.on('data', (chunk) => {
86 data += chunk;87 data.push(chunk);
87 });88 });
8889
89 resp.on('end', () => {90 resp.on('end', () => {
90 try {91 try {
91 const result = normaliseResponse(JSON.parse(data));92 const decodedData = iconv.decode(Buffer.concat(data), 'utf-8');
93 const result = normaliseResponse(JSON.parse(decodedData));
92 console.log('Translated text: ' + result.text);94 console.log('Translated text: ' + result.text);
95 response.setHeader('Content-Type', 'text/plain; charset=utf-8');
93 return response.send(result.text);96 return response.send(result.text);
94 } catch (error) {97 } catch (error) {
95 console.log('Translation error', error);98 console.log('Translation error', error);