From a9195e3e4e807727874bf95d172dcf106757cd3c Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Wed, 9 Feb 2022 14:17:24 -0500 Subject: [PATCH] fix implicit type conversion issue in options parser --- src/connection_string.ts | 30 ++++++++++++++++-------------- test/tools/uri_spec_runner.ts | 6 ++++++ 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/connection_string.ts b/src/connection_string.ts index 5ef29e49f85..ed015c53fe6 100644 --- a/src/connection_string.ts +++ b/src/connection_string.ts @@ -204,13 +204,24 @@ function getUint(name: string, value: unknown): number { return parsedValue; } - function toArray(value: T): T[]; function toArray(value: T[]): T[]; function toArray(value: T | T[]): T[] { return Array.isArray(value) ? value : [value]; } +function parseType(value: string): number | boolean | string { + try { + return getBoolean('', value); + } catch { + try { + return getInt('', value); + } catch { + return value; + } + } +} + function toRecord(value: string): Record { const record = Object.create(null); const keyValuePairs = value.split(','); @@ -219,18 +230,7 @@ function toRecord(value: string): Record { if (value == null) { throw new MongoParseError('Cannot have undefined values in key value pairs'); } - try { - // try to get a boolean - record[key] = getBoolean('', value); - } catch { - try { - // try to get a number - record[key] = getInt('', value); - } catch { - // keep value as a string - record[key] = value; - } - } + record[key] = value; } return record; } @@ -632,7 +632,9 @@ export const OPTIONS = { target: 'credentials', transform({ options, values: [value] }): MongoCredentials { if (typeof value === 'string') { - value = toRecord(value); + value = Object.fromEntries( + Object.entries(toRecord(value)).map(([key, value]) => [key, parseType(value)]) + ); } if (!isRecord(value)) { throw new MongoParseError('AuthMechanismProperties must be an object'); diff --git a/test/tools/uri_spec_runner.ts b/test/tools/uri_spec_runner.ts index 8a3fbecdd46..e5a9342dbad 100644 --- a/test/tools/uri_spec_runner.ts +++ b/test/tools/uri_spec_runner.ts @@ -221,6 +221,12 @@ export function executeUriValidationTest( .to.have.nested.property(expectedProp) .deep.equal(optionValue); break; + case 'maxStalenessSeconds': + expectedProp = 'readPreference.maxStalenessSeconds'; + expect(options, `${errorMessage} ${optionKey} -> ${expectedProp}`) + .to.have.nested.property(expectedProp) + .deep.equal(optionValue); + break; //** WRITE CONCERN OPTIONS **/ case 'w':