diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 73bd2aad8f96a0..178a3418dace0a 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -887,17 +887,6 @@ function write_(msg, chunk, encoding, callback, fromEnd) { err = new ERR_STREAM_DESTROYED('write'); } - if (!msg._hasBody) { - if (msg[kRejectNonStandardBodyWrites]) { - throw new ERR_HTTP_BODY_NOT_ALLOWED(); - } else { - debug('This type of response MUST NOT have a body. ' + - 'Ignoring write() calls.'); - process.nextTick(callback); - return true; - } - } - if (err) { if (!msg.destroyed) { onError(msg, err, callback); @@ -930,6 +919,17 @@ function write_(msg, chunk, encoding, callback, fromEnd) { msg._implicitHeader(); } + if (!msg._hasBody) { + if (msg[kRejectNonStandardBodyWrites]) { + throw new ERR_HTTP_BODY_NOT_ALLOWED(); + } else { + debug('This type of response MUST NOT have a body. ' + + 'Ignoring write() calls.'); + process.nextTick(callback); + return true; + } + } + if (!fromEnd && msg.socket && !msg.socket.writableCorked) { msg.socket.cork(); process.nextTick(connectionCorkNT, msg.socket); diff --git a/test/parallel/test-http-head-response-has-no-body-end-implicit-headers.js b/test/parallel/test-http-head-response-has-no-body-end-implicit-headers.js new file mode 100644 index 00000000000000..5ebd9f8a90bd92 --- /dev/null +++ b/test/parallel/test-http-head-response-has-no-body-end-implicit-headers.js @@ -0,0 +1,27 @@ +'use strict'; +const common = require('../common'); +const http = require('http'); + +// This test is to make sure that when the HTTP server +// responds to a HEAD request with data to res.end, +// it does not send any body but the response is sent +// anyway. + +const server = http.createServer(function(req, res) { + res.end('FAIL'); // broken: sends FAIL from hot path. +}); +server.listen(0); + +server.on('listening', common.mustCall(function() { + const req = http.request({ + port: this.address().port, + method: 'HEAD', + path: '/' + }, common.mustCall(function(res) { + res.on('end', common.mustCall(function() { + server.close(); + })); + res.resume(); + })); + req.end(); +})); diff --git a/test/parallel/test-http-head-response-has-no-body-end.js b/test/parallel/test-http-head-response-has-no-body-end.js index 3e0e6cec240ba8..824a1bafe3a5e3 100644 --- a/test/parallel/test-http-head-response-has-no-body-end.js +++ b/test/parallel/test-http-head-response-has-no-body-end.js @@ -29,7 +29,7 @@ const http = require('http'); const server = http.createServer(function(req, res) { res.writeHead(200); - res.end(); + res.end('FAIL'); // broken: sends FAIL from hot path. }); server.listen(0);