diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 6b1b8703f9f0de..0f1fe23749648c 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -866,6 +866,7 @@ function strictContentLength(msg) { ); } +let chunkBuffer = Buffer.alloc(0); function write_(msg, chunk, encoding, callback, fromEnd) { if (typeof callback !== 'function') callback = nop; @@ -930,11 +931,8 @@ function write_(msg, chunk, encoding, callback, fromEnd) { let ret; if (msg.chunkedEncoding && chunk.length !== 0) { - len ??= typeof chunk === 'string' ? Buffer.byteLength(chunk, encoding) : chunk.byteLength; - msg._send(NumberPrototypeToString(len, 16), 'latin1', null); - msg._send(crlf_buf, null, null); - msg._send(chunk, encoding, null, len); - ret = msg._send(crlf_buf, null, callback); + chunkBuffer = Buffer.concat([chunkBuffer, Buffer.from(chunk)]); + ret = true; } else { ret = msg._send(chunk, encoding, callback, len); } @@ -1046,6 +1044,14 @@ OutgoingMessage.prototype.end = function end(chunk, encoding, callback) { throw new ERR_HTTP_CONTENT_LENGTH_MISMATCH(this[kBytesWritten], this._contentLength); } + if (!this._headerSent && Buffer.byteLength(chunkBuffer)) { + this._send(NumberPrototypeToString(Buffer.byteLength(chunkBuffer), 16), 'latin1', null); + this._send(crlf_buf, null, null); + this._send(chunkBuffer, null, null); + this._send(crlf_buf, null, callback); + chunkBuffer = Buffer.alloc(0) + } + const finish = onFinish.bind(undefined, this); if (this._hasBody && this.chunkedEncoding) { @@ -1062,7 +1068,6 @@ OutgoingMessage.prototype.end = function end(chunk, encoding, callback) { this.socket.uncork(); } this[kCorked] = 0; - this.finished = true; // There is the first message on the outgoing queue, and we've sent diff --git a/test/own/test-http-outgoing-message.js b/test/own/test-http-outgoing-message.js new file mode 100644 index 00000000000000..58deb1d3c7fbaf --- /dev/null +++ b/test/own/test-http-outgoing-message.js @@ -0,0 +1,33 @@ +/* +In the first line of the test file you should +enable strict mode, unless you test something +that needs it disabled +*/ +'use strict'; + +/* +the common package gives you some commonly +used testing methods, like mustCall +*/ +const common = require('../common'); + +/* +a small description on what you are testing +*/ +// This test ensures that the http-parser can handle UTF-8 characters +// in the http header. + +const assert = require('assert'); +const http = require('http'); + +/* +the body of the actual test - tests should exit with code 0 on success +*/ +const server = http.createServer( + common.mustCall((request, response) => { + response.write('hello world'); + response.end(); + }) +); + +server.listen(3000, () => {});