diff --git a/src/body.js b/src/body.js index b0fe16bb2..714e27ec4 100644 --- a/src/body.js +++ b/src/body.js @@ -145,8 +145,8 @@ export default class Body { * @return Promise */ async json() { - const buffer = await consumeBody(this); - return JSON.parse(buffer.toString()); + const text = await this.text(); + return JSON.parse(text); } /** @@ -156,7 +156,7 @@ export default class Body { */ async text() { const buffer = await consumeBody(this); - return buffer.toString(); + return new TextDecoder().decode(buffer); } /** diff --git a/test/response.js b/test/response.js index 714cda1a6..b5157623f 100644 --- a/test/response.js +++ b/test/response.js @@ -77,6 +77,21 @@ describe('Response', () => { 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', () => { const res = new Response('a=1'); return res.text().then(result => {