From d37b21361e7d6076e778186ffe9caf552ac504f6 Mon Sep 17 00:00:00 2001 From: Robert Nagy Date: Tue, 6 Aug 2019 15:46:34 +0200 Subject: [PATCH] http: buffer while no socket --- lib/_http_outgoing.js | 4 +++- lib/internal/streams/state.js | 9 +++++++-- test/parallel/test-http-outgoing-buffer.js | 19 +++++++++++++++++++ 3 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 test/parallel/test-http-outgoing-buffer.js diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index ef7c8c65772b9d..e10f068f325959 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -23,6 +23,7 @@ const { Object, ObjectPrototype } = primordials; +const { getDefaultHighWaterMark } = require('internal/streams/state'); const assert = require('internal/assert'); const Stream = require('stream'); const internalUtil = require('internal/util'); @@ -51,6 +52,7 @@ const { } = require('internal/errors'); const { validateString } = require('internal/validators'); +const HIGH_WATER_MARK = getDefaultHighWaterMark(); const { CRLF, debug } = common; const kIsCorked = Symbol('isCorked'); @@ -277,7 +279,7 @@ function _writeRaw(data, encoding, callback) { this.outputData.push({ data, encoding, callback }); this.outputSize += data.length; this._onPendingData(data.length); - return false; + return this.outputSize < HIGH_WATER_MARK; } diff --git a/lib/internal/streams/state.js b/lib/internal/streams/state.js index c2fa2d364cb73a..a3f5e672862452 100644 --- a/lib/internal/streams/state.js +++ b/lib/internal/streams/state.js @@ -9,6 +9,10 @@ function highWaterMarkFrom(options, isDuplex, duplexKey) { isDuplex ? options[duplexKey] : null; } +function getDefaultHighWaterMark(objectMode) { + return objectMode ? 16 : 16 * 1024; +} + function getHighWaterMark(state, options, duplexKey, isDuplex) { const hwm = highWaterMarkFrom(options, isDuplex, duplexKey); if (hwm != null) { @@ -20,9 +24,10 @@ function getHighWaterMark(state, options, duplexKey, isDuplex) { } // Default value - return state.objectMode ? 16 : 16 * 1024; + return getDefaultHighWaterMark(state.objectMode); } module.exports = { - getHighWaterMark + getHighWaterMark, + getDefaultHighWaterMark }; diff --git a/test/parallel/test-http-outgoing-buffer.js b/test/parallel/test-http-outgoing-buffer.js new file mode 100644 index 00000000000000..d7db15f0ffae9c --- /dev/null +++ b/test/parallel/test-http-outgoing-buffer.js @@ -0,0 +1,19 @@ +// Flags: --expose-internals +'use strict'; +require('../common'); +const assert = require('assert'); +const { getDefaultHighWaterMark } = require('internal/streams/state'); + +const http = require('http'); +const OutgoingMessage = http.OutgoingMessage; + +const msg = new OutgoingMessage(); +msg._implicitHeader = function() {}; + +// Writes should be buffered until highwatermark +// even when no socket is assigned. + +assert.strictEqual(msg.write('asd'), true); +while (msg.write('asd')); +const highwatermark = msg.writableHighWaterMark || getDefaultHighWaterMark(); +assert(msg.outputSize >= highwatermark);