Skip to content

Commit 2dc94ae

Browse files
committedOct 18, 2019
Properly parse meta tag when fields are reversed
Via: node-fetch/node-fetch#682
1 parent 64f6d63 commit 2dc94ae

File tree

4 files changed

+27
-0
lines changed

4 files changed

+27
-0
lines changed
 

‎lib/body.js

+6
Original file line numberDiff line numberDiff line change
@@ -293,6 +293,12 @@ const convertBody = (buffer, headers) => {
293293
if (!res && str) {
294294
res = /<meta[\s]+?http-equiv=(['"])content-type\1[\s]+?content=(['"])(.+?)\2/i.exec(str)
295295

296+
if (!res) {
297+
res = /<meta[\s]+?content=(['"])(.+?)\1[\s]+?http-equiv=(['"])content-type\3/i.exec(str)
298+
if (res)
299+
res.pop() // drop last quote
300+
}
301+
296302
if (res)
297303
res = /charset=(.*)/i.exec(res.pop())
298304
}

‎test/body.js

+7
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,13 @@ t.test('convert body', t => {
307307
t.equal(await b.textConverted(), s)
308308
})
309309

310+
t.test('html4 meta tag reversed', async t => {
311+
const s = '<meta content="text/html; charset=gbk" http-equiv="Content-Type"><div>中文L</div>'
312+
const b = new Body(convert(s, 'gbk'))
313+
t.equal(await b.textConverted(), s)
314+
})
315+
316+
310317
t.test('html5 meta tag', async t => {
311318
const s = '<meta charset="gbk"><div>中文</div>'
312319
const b = new Body(convert(s, 'gbk'))

‎test/fixtures/server.js

+6
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,12 @@ class TestServer {
164164
res.end(convert('<meta http-equiv="Content-Type" content="text/html; charset=gb2312"><div>中文</div>', 'gb2312'))
165165
}
166166

167+
if (p === '/encoding/gb2312-reverse') {
168+
res.statusCode = 200;
169+
res.setHeader('Content-Type', 'text/html');
170+
res.end(convert('<meta content="text/html; charset=gb2312" http-equiv="Content-Type"><div>中文</div>', 'gb2312'));
171+
}
172+
167173
if (p === '/encoding/shift-jis') {
168174
res.statusCode = 200
169175
res.setHeader('Content-Type', 'text/html; charset=Shift-JIS')

‎test/index.js

+8
Original file line numberDiff line numberDiff line change
@@ -1767,6 +1767,14 @@ t.test('with optional `encoding`', t => {
17671767
})
17681768
}))
17691769

1770+
t.test('encoding decode, html4 detect reverse http-equiv', t =>
1771+
fetch(`${base}encoding/gb2312-reverse`).then(res => {
1772+
t.equal(res.status, 200)
1773+
return res.textConverted().then(result => {
1774+
t.equal(result, '<meta content="text/html; charset=gb2312" http-equiv="Content-Type"><div>中文</div>')
1775+
})
1776+
}))
1777+
17701778
t.test('default to utf8 encoding', t =>
17711779
fetch(`${base}encoding/utf8`).then(res => {
17721780
t.equal(res.status, 200)

0 commit comments

Comments
 (0)