fix: handle bom in text and json (#1739)

* fix: handle bom in text and json
* add unit tests
This commit is contained in:
Alexis Clarembeau 2023-05-08 18:19:42 +02:00 committed by GitHub
parent 70f592d9d2
commit 29909d75c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 5 deletions

View File

@ -39,7 +39,7 @@
"dependencies": {
"whatwg-url": "^5.0.0"
},
"peerDependencies": {
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {

View File

@ -114,9 +114,9 @@ Body.prototype = {
* @return Promise
*/
json() {
return consumeBody.call(this).then((buffer) => {
try {
return JSON.parse(buffer.toString());
return this.text().then((text) => {
try{
return JSON.parse(text);
} catch (err) {
return Body.Promise.reject(new FetchError(`invalid json response body at ${this.url} reason: ${err.message}`, 'invalid-json'));
}
@ -129,7 +129,7 @@ Body.prototype = {
* @return Promise
*/
text() {
return consumeBody.call(this).then(buffer => buffer.toString());
return consumeBody.call(this).then(buffer => new TextDecoder().decode(buffer));
},
/**

View File

@ -2479,6 +2479,21 @@ describe('Response', function () {
expect(res.headers.get('a')).to.equal('1');
});
it('should decode responses containing BOM to json', async () => {
const json = await new Response('\uFEFF{"a":1}').json();
expect(json.a).to.equal(1);
});
it('should decode responses containing BOM to text', async () => {
const text = await new Response('\uFEFF{"a":1}').text();
expect(text).to.equal('{"a":1}');
});
it('should keep BOM when getting raw bytes', async () => {
const ab = await new Response('\uFEFF{"a":1}').arrayBuffer();
expect(ab.byteLength).to.equal(10);
});
it('should support text() method', function() {
const res = new Response('a=1');
return res.text().then(result => {