diff --git a/lib/_http_outgoing.js b/lib/_http_outgoing.js index 606c3da9bd75fc..442369581d3779 100644 --- a/lib/_http_outgoing.js +++ b/lib/_http_outgoing.js @@ -60,6 +60,7 @@ const { hideStackFrames } = require('internal/errors'); const { validateString } = require('internal/validators'); +const { isUint8Array } = require('internal/util/types'); const HIGH_WATER_MARK = getDefaultHighWaterMark(); const { CRLF, debug } = common; @@ -649,9 +650,9 @@ function write_(msg, chunk, encoding, callback, fromEnd) { return true; } - if (!fromEnd && typeof chunk !== 'string' && !(chunk instanceof Buffer)) { + if (!fromEnd && typeof chunk !== 'string' && !isUint8Array(chunk)) { throw new ERR_INVALID_ARG_TYPE('first argument', - ['string', 'Buffer'], chunk); + ['string', 'Buffer', 'Uint8Array'], chunk); } if (!fromEnd && msg.connection && !msg.connection.writableCorked) { @@ -742,7 +743,8 @@ OutgoingMessage.prototype.end = function end(chunk, encoding, callback) { if (chunk) { if (typeof chunk !== 'string' && !(chunk instanceof Buffer)) { - throw new ERR_INVALID_ARG_TYPE('chunk', ['string', 'Buffer'], chunk); + throw new ERR_INVALID_ARG_TYPE( + 'chunk', ['string', 'Buffer', 'Uint8Array'], chunk); } if (!this._header) { if (typeof chunk === 'string') diff --git a/test/parallel/test-http-outgoing-proto.js b/test/parallel/test-http-outgoing-proto.js index b037c88c6833e9..638e860f62b538 100644 --- a/test/parallel/test-http-outgoing-proto.js +++ b/test/parallel/test-http-outgoing-proto.js @@ -80,7 +80,7 @@ assert.throws(() => { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The first argument must be of type string or an instance of ' + - 'Buffer. Received undefined' + 'Buffer or Uint8Array. Received undefined' }); assert.throws(() => { @@ -90,7 +90,7 @@ assert.throws(() => { code: 'ERR_INVALID_ARG_TYPE', name: 'TypeError', message: 'The first argument must be of type string or an instance of ' + - 'Buffer. Received type number (1)' + 'Buffer or Uint8Array. Received type number (1)' }); // addTrailers() diff --git a/test/parallel/test-http-outgoing-write-types.js b/test/parallel/test-http-outgoing-write-types.js new file mode 100644 index 00000000000000..6257b87eea8eb1 --- /dev/null +++ b/test/parallel/test-http-outgoing-write-types.js @@ -0,0 +1,24 @@ +'use strict'; +const common = require('../common'); +const assert = require('assert'); +const http = require('http'); + +const httpServer = http.createServer(common.mustCall(function(req, res) { + httpServer.close(); + assert.throws(() => { + res.write(['Throws.']); + }, { + code: 'ERR_INVALID_ARG_TYPE' + }); + // should not throw + res.write('1a2b3c'); + // should not throw + res.write(new Uint8Array(1024)); + // should not throw + res.write(Buffer.from('1'.repeat(1024))); + res.end(); +})); + +httpServer.listen(0, common.mustCall(function() { + http.get({ port: this.address().port }); +}));