From bd857084de75815d0d60d4a7dd4897dfc9e6cdec Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Tue, 6 Aug 2019 15:30:06 +0200 Subject: [PATCH] http: add missing stream-like properties to OutgoingMessage PR-URL: https://github.com/nodejs/node/pull/29018 Reviewed-By: Anna Henningsen Reviewed-By: James M Snell Reviewed-By: Matteo Collina Reviewed-By: Rich Trott --- lib/_http_outgoing.js | 20 ++++++- .../parallel/test-http-outgoing-properties.js | 53 +++++++++++++++++++ 2 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 test/parallel/test-http-outgoing-properties.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index e10f068f325959..9477a9b7f70b6e 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -112,7 +112,7 @@ Object.setPrototypeOf(OutgoingMessage.prototype, Stream.prototype); Object.setPrototypeOf(OutgoingMessage, Stream); Object.defineProperty(OutgoingMessage.prototype, 'writableFinished', { - get: function() { + get() { return ( this.finished && this.outputSize === 0 && @@ -121,6 +121,24 @@ Object.defineProperty(OutgoingMessage.prototype, 'writableFinished', { } }); +Object.defineProperty(OutgoingMessage.prototype, 'writableObjectMode', { + get() { + return false; + } +}); + +Object.defineProperty(OutgoingMessage.prototype, 'writableLength', { + get() { + return this.outputSize + (this.socket ? this.socket.writableLength : 0); + } +}); + +Object.defineProperty(OutgoingMessage.prototype, 'writableHighWaterMark', { + get() { + return this.socket ? this.socket.writableHighWaterMark : HIGH_WATER_MARK; + } +}); + Object.defineProperty(OutgoingMessage.prototype, '_headers', { get: internalUtil.deprecate(function() { return this.getHeaders(); diff --git a/test/parallel/test-http-outgoing-properties.js b/test/parallel/test-http-outgoing-properties.js new file mode 100644 index 00000000000000..3bb6c637bf004d --- /dev/null +++ b/test/parallel/test-http-outgoing-properties.js @@ -0,0 +1,53 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); + +const http = require('http'); +const OutgoingMessage = http.OutgoingMessage; + +{ + const msg = new OutgoingMessage(); + assert.strictEqual(msg.writableObjectMode, false); +} + +{ + const msg = new OutgoingMessage(); + assert(msg.writableHighWaterMark > 0); +} + +{ + const server = http.createServer(common.mustCall(function(req, res) { + const hwm = req.socket.writableHighWaterMark; + assert.strictEqual(res.writableHighWaterMark, hwm); + + assert.strictEqual(res.writableLength, 0); + res.write(''); + const len = res.writableLength; + res.write('asd'); + assert.strictEqual(res.writableLength, len + 8); + res.end(); + res.on('finish', common.mustCall(() => { + assert.strictEqual(res.writableLength, 0); + server.close(); + })); + })); + + server.listen(0); + + server.on('listening', common.mustCall(function() { + const clientRequest = http.request({ + port: server.address().port, + method: 'GET', + path: '/' + }); + clientRequest.end(); + })); +} + +{ + const msg = new OutgoingMessage(); + msg._implicitHeader = function() {}; + assert.strictEqual(msg.writableLength, 0); + msg.write('asd'); + assert.strictEqual(msg.writableLength, 7); +}