Browse Source

Implemented CSHARP-346. Support numeric IPv6 addresses in connection strings. Final testing pending since I'm on the road and my VirtualBox VM doesn't seem to support IPv6. Will do final testing once I get back to a real Windows machine.

pull/71/head
rstam 14 years ago
parent
commit
f382ae47b2
  1. 2
      Driver/Core/MongoServerAddress.cs
  2. 3
      Driver/Core/MongoUrlBuilder.cs
  3. 1
      DriverUnitTests/DriverUnitTests.csproj
  4. 155
      DriverUnitTests/Jira/CSharp346Tests.cs

2
Driver/Core/MongoServerAddress.cs

@ -87,7 +87,7 @@ namespace MongoDB.Driver {
out MongoServerAddress address
) {
if (value != null) {
Match match = Regex.Match(value, @"^(?<host>[^:]+)(:(?<port>\d+))?$");
Match match = Regex.Match(value, @"^(?<host>(\[[^]]+?\]|[^:]+))(:(?<port>\d+))?$");
if (match.Success) {
string host = match.Groups["host"].Value;
string portString = match.Groups["port"].Value;

3
Driver/Core/MongoUrlBuilder.cs

@ -387,10 +387,11 @@ namespace MongoDB.Driver {
string url
) {
ResetValues();
const string serverPattern = @"((\[[^]]+?\]|[^:,/]+)(:\d+)?)";
const string pattern =
@"^mongodb://" +
@"((?<username>[^:]+):(?<password>[^@]+)@)?" +
@"(?<servers>[^:,/]+(:\d+)?(,[^:,/]+(:\d+)?)*)" +
@"(?<servers>" + serverPattern + "(," + serverPattern + ")*)" +
@"(/(?<database>[^?]+)?(\?(?<query>.*))?)?$";
Match match = Regex.Match(url, pattern);
if (match.Success) {

1
DriverUnitTests/DriverUnitTests.csproj

@ -100,6 +100,7 @@
<Compile Include="Jira\CSharp283Tests.cs" />
<Compile Include="Jira\CSharp290Tests.cs" />
<Compile Include="Jira\CSharp321Tests.cs" />
<Compile Include="Jira\CSharp346Tests.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="Builders\QueryBuilderTests.cs" />
<Compile Include="Builders\SortByBuilderTests.cs" />

155
DriverUnitTests/Jira/CSharp346Tests.cs

@ -0,0 +1,155 @@
/* Copyright 2010-2011 10gen Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using NUnit.Framework;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using MongoDB.Driver.Wrappers;
namespace MongoDB.DriverUnitTests.Jira.CSharp346 {
[TestFixture]
public class CSharp346Tests {
[Test]
public void TestOneIPv6Address() {
var connectionString = "mongodb://[::1:]/?safe=true";
var url = new MongoUrl(connectionString);
Assert.AreEqual("[::1:]", url.Server.Host);
Assert.AreEqual(27017, url.Server.Port);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "server=[::1:];safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
Assert.AreEqual("[::1:]", builder.Server.Host);
Assert.AreEqual(27017, builder.Server.Port);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
[Test]
public void TestOneIPv6AddressWithDefaultCredentials() {
var connectionString = "mongodb://username:password@[::1:]/?safe=true";
var url = new MongoUrl(connectionString);
Assert.AreEqual("[::1:]", url.Server.Host);
Assert.AreEqual(27017, url.Server.Port);
Assert.AreEqual("username", url.DefaultCredentials.Username);
Assert.AreEqual("password", url.DefaultCredentials.Password);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "server=[::1:];username=username;password=password;safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
Assert.AreEqual("[::1:]", builder.Server.Host);
Assert.AreEqual(27017, builder.Server.Port);
Assert.AreEqual("username", builder.Username);
Assert.AreEqual("password", builder.Password);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
[Test]
public void TestOneIPv6AddressWithPort() {
var connectionString = "mongodb://[::1:]:1234/?safe=true";
var url = new MongoUrl(connectionString);
Assert.AreEqual("[::1:]", url.Server.Host);
Assert.AreEqual(1234, url.Server.Port);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "server=[::1:]:1234;safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
Assert.AreEqual("[::1:]", builder.Server.Host);
Assert.AreEqual(1234, builder.Server.Port);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
[Test]
public void TestTwoIPv6Addresses() {
var connectionString = "mongodb://[::1:],[::2:]/?safe=true";
var url = new MongoUrl(connectionString);
var servers = url.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(27017, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(27017, servers[1].Port);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "servers=[::1:],[::2:];safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
servers = builder.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(27017, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(27017, servers[1].Port);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
[Test]
public void TestTwoIPv6AddressesWithDefaultCredentials() {
var connectionString = "mongodb://username:password@[::1:],[::2:]/?safe=true";
var url = new MongoUrl(connectionString);
var servers = url.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(27017, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(27017, servers[1].Port);
Assert.AreEqual("username", url.DefaultCredentials.Username);
Assert.AreEqual("password", url.DefaultCredentials.Password);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "servers=[::1:],[::2:];username=username;password=password;safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
servers = builder.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(27017, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(27017, servers[1].Port);
Assert.AreEqual("username", url.DefaultCredentials.Username);
Assert.AreEqual("password", url.DefaultCredentials.Password);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
[Test]
public void TestTwoIPv6AddressesWithPorts() {
var connectionString = "mongodb://[::1:]:1234,[::2:]:2345/?safe=true";
var url = new MongoUrl(connectionString);
var servers = url.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(1234, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(2345, servers[1].Port);
Assert.AreEqual(true, url.SafeMode.Enabled);
connectionString = "servers=[::1:]:1234,[::2:]:2345;safe=true";
var builder = new MongoConnectionStringBuilder(connectionString);
servers = builder.Servers.ToArray();
Assert.AreEqual(2, servers.Length);
Assert.AreEqual("[::1:]", servers[0].Host);
Assert.AreEqual(1234, servers[0].Port);
Assert.AreEqual("[::2:]", servers[1].Host);
Assert.AreEqual(2345, servers[1].Port);
Assert.AreEqual(true, builder.SafeMode.Enabled);
}
}
}
Loading…
Cancel
Save