diff --git a/lib/api/readable.js b/lib/api/readable.js index 4184a867569..9c184d14e1c 100644 --- a/lib/api/readable.js +++ b/lib/api/readable.js @@ -93,7 +93,7 @@ module.exports = class BodyReadable extends Readable { } push (chunk) { - if (this[kConsume] && chunk !== null) { + if (this[kConsume] && chunk !== null && this.readableLength === 0) { consumePush(this[kConsume], chunk) return this[kReading] ? super.push(chunk) : true } diff --git a/test/readable.test.js b/test/readable.test.js new file mode 100644 index 00000000000..da329939896 --- /dev/null +++ b/test/readable.test.js @@ -0,0 +1,23 @@ +'use strict' + +const { test } = require('tap') +const Readable = require('../lib/api/readable') + +test('avoid body reordering', async function (t) { + function resume () { + } + function abort () { + } + const r = new Readable(resume, abort) + + r.push(Buffer.from('hello')) + + process.nextTick(() => { + r.push(Buffer.from('world')) + r.push(null) + }) + + const text = await r.text() + + t.equal(text, 'helloworld') +})