Fix Google translate result decoding Inspired by #2522
| @@ -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", |
| @@ -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", |
| @@ -1,6 +1,7 @@ | |||
| 1 | const fetch = require('node-fetch').default; | 1 | const fetch = require('node-fetch').default; |
| 2 | const https = require('https'); | 2 | const https = require('https'); |
| 3 | const express = require('express'); | 3 | const express = require('express'); |
| 4 | const iconv = require('iconv-lite'); | ||
| 4 | const { readSecret, SECRET_KEYS } = require('./secrets'); | 5 | const { readSecret, SECRET_KEYS } = require('./secrets'); |
| 5 | const { getConfigValue, uuidv4 } = require('../util'); | 6 | const { getConfigValue, uuidv4 } = require('../util'); |
| 6 | const { jsonParser } = require('../express-common'); | 7 | const { 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 }); |
| 81 | 82 | ||
| 82 | https.get(url, (resp) => { | 83 | https.get(url, (resp) => { |
| 83 | let data = ''; | 84 | const data = []; |
| 84 | 85 | ||
| 85 | resp.on('data', (chunk) => { | 86 | resp.on('data', (chunk) => { |
| 86 | data += chunk; | 87 | data.push(chunk); |
| 87 | }); | 88 | }); |
| 88 | 89 | ||
| 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); |