diff --git a/lib/internal/http2/core.js b/lib/internal/http2/core.js index 48b73ae54ce9f6..836dec0b29589d 100644 --- a/lib/internal/http2/core.js +++ b/lib/internal/http2/core.js @@ -126,7 +126,8 @@ const { validateNumber, validateString, validateUint32, - validateAbortSignal + validateAbortSignal, + validateBoolean, } = require('internal/validators'); const fsPromisesInternal = require('internal/fs/promises'); const { utcDate } = require('internal/http'); @@ -761,27 +762,27 @@ function requestOnConnect(headers, options) { const setAndValidatePriorityOptions = hideStackFrames((options) => { if (options.weight === undefined) { options.weight = NGHTTP2_DEFAULT_WEIGHT; - } else if (typeof options.weight !== 'number') { - throw new ERR_INVALID_ARG_VALUE('options.weight', options.weight); - } + } + + validateNumber(options.weight, 'options.weight'); if (options.parent === undefined) { options.parent = 0; - } else if (typeof options.parent !== 'number' || options.parent < 0) { - throw new ERR_INVALID_ARG_VALUE('options.parent', options.parent); - } + } + + validateNumber(options.parent, 'options.parent', 0); if (options.exclusive === undefined) { options.exclusive = false; - } else if (typeof options.exclusive !== 'boolean') { - throw new ERR_INVALID_ARG_VALUE('options.exclusive', options.exclusive); } + validateBoolean(options.exclusive, 'options.exclusive'); + if (options.silent === undefined) { options.silent = false; - } else if (typeof options.silent !== 'boolean') { - throw new ERR_INVALID_ARG_VALUE('options.silent', options.silent); } + + validateBoolean(options.silent, 'options.silent'); }); // When an error occurs internally at the binding level, immediately @@ -1784,10 +1785,11 @@ class ClientHttp2Session extends Http2Session { // stream by default if the user has not specifically indicated a // preference. options.endStream = isPayloadMeaningless(headers[HTTP2_HEADER_METHOD]); - } else if (typeof options.endStream !== 'boolean') { - throw new ERR_INVALID_ARG_VALUE('options.endStream', options.endStream); } + validateBoolean(options.endStream, 'options.endStream'); + + const headersList = mapToHeaders(headers); const stream = new ClientHttp2Stream(this, undefined, undefined, {}); diff --git a/test/parallel/test-http2-client-request-options-errors.js b/test/parallel/test-http2-client-request-options-errors.js index f2950fe4d287b4..9d7cec2abfa479 100644 --- a/test/parallel/test-http2-client-request-options-errors.js +++ b/test/parallel/test-http2-client-request-options-errors.js @@ -28,6 +28,25 @@ const types = { symbol: Symbol('test') }; +function determineSpecificType(value) { + if (value == null) { + return '' + value; + } + if (typeof value === 'function' && value.name) { + return `function ${value.name}`; + } + if (typeof value === 'object') { + if (value.constructor?.name) { + return `an instance of ${value.constructor.name}`; + } + return `${inspect(value, { depth: -1 })}`; + } + let inspected = inspect(value, { colors: false }); + if (inspected.length > 28) { inspected = `${StringPrototypeSlice(inspected, 0, 25)}...`; } + + return `type ${typeof value} (${inspected})`; +} + const server = http2.createServer(common.mustNotCall()); server.listen(0, common.mustCall(() => { @@ -48,9 +67,9 @@ server.listen(0, common.mustCall(() => { [option]: types[type] }), { name: 'TypeError', - code: 'ERR_INVALID_ARG_VALUE', - message: `The property 'options.${option}' is invalid. ` + - `Received ${inspect(types[type])}` + code: 'ERR_INVALID_ARG_TYPE', + message: `The "options.${option}" property must be of type ${optionsToTest[option]}. ` + + `Received ${determineSpecificType(types[type])}` }); }); });