Skip to content

Commit

Permalink
fix: handle bom in text and json (#1739)
Browse files Browse the repository at this point in the history
* fix: handle bom in text and json
* add unit tests
  • Loading branch information
aclarembeau authored May 8, 2023
1 parent 70f592d commit 29909d7
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 5 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"dependencies": {
"whatwg-url": "^5.0.0"
},
"peerDependencies": {
"peerDependencies": {
"encoding": "^0.1.0"
},
"peerDependenciesMeta": {
Expand Down
8 changes: 4 additions & 4 deletions src/body.js
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
}
Expand All @@ -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));
},

/**
Expand Down
15 changes: 15 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 => {
Expand Down

0 comments on commit 29909d7

Please sign in to comment.