diff --git a/driver-core/src/main/com/mongodb/ConnectionString.java b/driver-core/src/main/com/mongodb/ConnectionString.java index 062ca1d45c..659e8fd02a 100644 --- a/driver-core/src/main/com/mongodb/ConnectionString.java +++ b/driver-core/src/main/com/mongodb/ConnectionString.java @@ -56,6 +56,7 @@ import static com.mongodb.internal.connection.OidcAuthenticator.OidcValidator.validateCreateOidcCredential; import static java.lang.String.format; import static java.util.Arrays.asList; +import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; import static java.util.Collections.unmodifiableList; @@ -505,7 +506,7 @@ public ConnectionString(final String connectionString, @Nullable final DnsClient throw new IllegalArgumentException("srvMaxHosts can not be specified with replica set name"); } - validateProxyParameters(); + validateProxyParameters(combinedOptionsMaps); credential = createCredentials(combinedOptionsMaps, userName, password); warnOnUnsupportedOptions(combinedOptionsMaps); @@ -1226,7 +1227,7 @@ private void validatePort(final String port) { } } - private void validateProxyParameters() { + private void validateProxyParameters(final Map> optionsMap) { if (proxyHost == null) { if (proxyPort != null) { throw new IllegalArgumentException("proxyPort can only be specified with proxyHost"); @@ -1259,6 +1260,23 @@ private void validateProxyParameters() { throw new IllegalArgumentException( "Both proxyUsername and proxyPassword must be set together. They cannot be set individually"); } + + if (containsDuplicatedOptions("proxyhost", optionsMap)) { + throw new IllegalArgumentException("Duplicated values for proxyHost: " + optionsMap.get("proxyhost")); + } + if (containsDuplicatedOptions("proxyport", optionsMap)) { + throw new IllegalArgumentException("Duplicated values for proxyPort: " + optionsMap.get("proxyport")); + } + if (containsDuplicatedOptions("proxypassword", optionsMap)) { + throw new IllegalArgumentException("Duplicated values for proxyPassword: " + optionsMap.get("proxypassword")); + } + if (containsDuplicatedOptions("proxyusername", optionsMap)) { + throw new IllegalArgumentException("Duplicated values for proxyUsername: " + optionsMap.get("proxyusername")); + } + } + + private static boolean containsDuplicatedOptions(final String optionName, final Map> optionsMap) { + return optionsMap.getOrDefault(optionName, emptyList()).size() > 1; } private int countOccurrences(final String haystack, final String needle) { diff --git a/driver-core/src/test/unit/com/mongodb/UriOptionsTest.java b/driver-core/src/test/unit/com/mongodb/UriOptionsTest.java index d3cb925ead..736e3f5d20 100644 --- a/driver-core/src/test/unit/com/mongodb/UriOptionsTest.java +++ b/driver-core/src/test/unit/com/mongodb/UriOptionsTest.java @@ -47,9 +47,6 @@ public void shouldPassAllOutcomes() { // No CANONICALIZE_HOST_NAME support https://jira.mongodb.org/browse/JAVA-4278 assumeFalse(getDescription().equals("Valid auth options are parsed correctly (GSSAPI)")); - // https://jira.mongodb.org/browse/JAVA-5834 - assumeFalse(getFilename().equals("proxy-options.json")); - if (getDefinition().getBoolean("valid", BsonBoolean.TRUE).getValue()) { testValidOptions(); } else {