Skip to content

Commit

Permalink
http: buffer writes even while no socket assigned
Browse files Browse the repository at this point in the history
PR-URL: #29019
Reviewed-By: Luigi Pinca <luigipinca@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
  • Loading branch information
ronag authored and Trott committed Aug 9, 2019
1 parent 53e467d commit c065773
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 3 deletions.
4 changes: 3 additions & 1 deletion lib/_http_outgoing.js
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down Expand Up @@ -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');
Expand Down Expand Up @@ -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;
}


Expand Down
9 changes: 7 additions & 2 deletions lib/internal/streams/state.js
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand All @@ -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
};
19 changes: 19 additions & 0 deletions test/parallel/test-http-outgoing-buffer.js
Original file line number Diff line number Diff line change
@@ -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);

0 comments on commit c065773

Please sign in to comment.