diff --git a/src/resource/index.js b/src/resource/index.js index 6d982773..a64a3b00 100644 --- a/src/resource/index.js +++ b/src/resource/index.js @@ -26,7 +26,11 @@ const Resource = { }, }; - result = { body: preparedResponse, response: validResponse }; + result = { + body: preparedResponse, + response: validResponse, + alreadyDecoded: true, + }; } else { result = await fetchResource(url, parsedUrl, headers); } @@ -39,7 +43,7 @@ const Resource = { return this.generateDoc(result); }, - generateDoc({ body: content, response }) { + generateDoc({ body: content, response, alreadyDecoded = false }) { const { 'content-type': contentType = '' } = response.headers; // TODO: Implement is_text function from @@ -48,7 +52,7 @@ const Resource = { throw new Error('Content does not appear to be text.'); } - let $ = this.encodeDoc({ content, contentType }); + let $ = this.encodeDoc({ content, contentType, alreadyDecoded }); if ($.root().children().length === 0) { throw new Error('No children, likely a bad parse.'); @@ -61,11 +65,14 @@ const Resource = { return $; }, - encodeDoc({ content, contentType }) { + encodeDoc({ content, contentType, alreadyDecoded = false }) { + if (alreadyDecoded) { + return cheerio.load(content); + } + const encoding = getEncoding(contentType); let decodedContent = iconv.decode(content, encoding); let $ = cheerio.load(decodedContent); - // after first cheerio.load, check to see if encoding matches const contentTypeSelector = cheerio.browser ? 'meta[http-equiv=content-type]' diff --git a/src/resource/index.test.js b/src/resource/index.test.js index b3573ab7..630a6a7e 100644 --- a/src/resource/index.test.js +++ b/src/resource/index.test.js @@ -78,6 +78,16 @@ describe('Resource', () => { assert.equal(badEncodingRe.test($.html()), false); assert.equal(typeof $, 'function'); }); + + it('doesnt mangle non-ascii characters in prefetched response', async () => { + const url = 'https://www.gruene.de/themen/digitalisierung'; + const prefetched = + '

Wir gestalten die Digitalisierung

Wir Grüne kämpfen für ein offenes, gemeinwohlorientiertes Netz. Wir wollen den digitalen Wandel gerecht gestalten und setzen uns für Verantwortung, Freiheit und Recht im Netz ein. Netzpolitik und Digitalisierung sind zentrale politische Querschnittsaufgaben für eine moderne Gesellschaft. Im Mittelpunkt stehen für uns eine zukunftsfähige digitale Infrastruktur, der freie und gleichberechtigte Zugang zum Netz für alle, der Schutz unserer Privatsphäre und persönlichen Daten, sowie eine modernisierte Verwaltung.

'; + + const $ = await Resource.create(url, prefetched); + assert.equal(/Grüne/.test($.html()), true); + assert.equal(/�/.test($.html()), false); + }); }); describe('generateDoc({ body, response })', () => {