Skip to content

Commit

Permalink
http: call write callback even if there is no message body
Browse files Browse the repository at this point in the history
Ensure that the callback of `OutgoingMessage.prototype.write()` is
called when `outgoingMessage._hasBody` is `false` (HEAD method, 204
status code, etc.).

Refs: #27709

PR-URL: #27777
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
Reviewed-By: Rich Trott <rtrott@gmail.com>
  • Loading branch information
lpinca authored and targos committed Jun 1, 2019
1 parent 9b08c45 commit 8b38dfb
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 22 deletions.
1 change: 1 addition & 0 deletions lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -573,6 +573,7 @@ function write_(msg, chunk, encoding, callback, fromEnd) {
if (!msg._hasBody) {
debug('This type of response MUST NOT have a body. ' +
'Ignoring write() calls.');
if (callback) process.nextTick(callback);
return true;
}

Expand Down
46 changes: 24 additions & 22 deletions test/parallel/test-http-outgoing-message-write-callback.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,35 +3,37 @@
const common = require('../common');

// This test ensures that the callback of `OutgoingMessage.prototype.write()` is
// called also when writing empty chunks.
// called also when writing empty chunks or when the message has no body.

const assert = require('assert');
const http = require('http');
const stream = require('stream');

const expected = ['a', 'b', '', Buffer.alloc(0), 'c'];
const results = [];
for (const method of ['GET, HEAD']) {
const expected = ['a', 'b', '', Buffer.alloc(0), 'c'];
const results = [];

const writable = new stream.Writable({
write(chunk, encoding, callback) {
setImmediate(callback);
}
});
const writable = new stream.Writable({
write(chunk, encoding, callback) {
callback();
}
});

const res = new http.ServerResponse({
method: 'GET',
httpVersionMajor: 1,
httpVersionMinor: 1
});
const res = new http.ServerResponse({
method: method,
httpVersionMajor: 1,
httpVersionMinor: 1
});

res.assignSocket(writable);
res.assignSocket(writable);

for (const chunk of expected) {
res.write(chunk, () => {
results.push(chunk);
});
}
for (const chunk of expected) {
res.write(chunk, () => {
results.push(chunk);
});
}

res.end(common.mustCall(() => {
assert.deepStrictEqual(results, expected);
}));
res.end(common.mustCall(() => {
assert.deepStrictEqual(results, expected);
}));
}

0 comments on commit 8b38dfb

Please sign in to comment.