Skip to content

Commit 3845931

Browse files
committed
Improvements
1 parent 3665a29 commit 3845931

File tree

3 files changed

+65
-32
lines changed

3 files changed

+65
-32
lines changed

src/MongoDB.Driver/Core/Connections/Socks5Helper.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ public static void PerformSocks5Handshake(Stream stream, EndPoint endPoint, stri
104104
// | 1 | 1 | 1 to 255 | 1 | 1 to 255 |
105105
// +----+------+----------+------+----------+
106106
buffer[0] = SubnegotiationVersion;
107-
//TODO Maybe it can be extracted to a method?
108107
#if NET472
109108
var usernameLength = EncodeString(proxyUsername, buffer, 2, nameof(proxyUsername));
110109
#else

src/MongoDB.Driver/Core/Connections/TcpStreamFactory.cs

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -48,23 +48,27 @@ public TcpStreamFactory(TcpStreamSettings settings)
4848
// methods
4949
public Stream CreateStream(EndPoint endPoint, CancellationToken cancellationToken)
5050
{
51-
EndPoint actualEndPoint;
52-
53-
actualEndPoint = _settings.UseProxy ? new DnsEndPoint(_settings.ProxyHost, _settings.ProxyPort.Value) : endPoint;
51+
var targetEndpoint = _settings.UseProxy ? new DnsEndPoint(_settings.ProxyHost, _settings.ProxyPort.Value) : endPoint;
5452

5553
#if NET472
56-
var socket = CreateSocket(actualEndPoint);
57-
Connect(socket, actualEndPoint, cancellationToken);
58-
return CreateNetworkStream(socket);
54+
var socket = CreateSocket(targetEndpoint);
55+
Connect(socket, targetEndpoint, cancellationToken);
56+
var stream = CreateNetworkStream(socket);
57+
if (_settings.UseProxy)
58+
{
59+
Socks5Helper.PerformSocks5Handshake(stream, endPoint, _settings.ProxyUsername, _settings.ProxyPassword, cancellationToken);
60+
}
61+
62+
return stream;
5963
#else
60-
var resolved = ResolveEndPoints(actualEndPoint);
64+
var resolved = ResolveEndPoints(targetEndpoint);
6165
for (int i = 0; i < resolved.Length; i++)
6266
{
6367
try
6468
{
6569
var socket = CreateSocket(resolved[i]);
6670
Connect(socket, resolved[i], cancellationToken);
67-
var stream = CreateNetworkStream(socket);
71+
var stream = CreateNetworkStream(socket);
6872

6973
//TODO Need to do the same for the async version and for net472
7074
if (_settings.UseProxy)
@@ -92,19 +96,34 @@ public Stream CreateStream(EndPoint endPoint, CancellationToken cancellationToke
9296

9397
public async Task<Stream> CreateStreamAsync(EndPoint endPoint, CancellationToken cancellationToken)
9498
{
99+
var targetEndpoint = _settings.UseProxy ? new DnsEndPoint(_settings.ProxyHost, _settings.ProxyPort.Value) : endPoint;
100+
95101
#if NET472
96-
var socket = CreateSocket(endPoint);
97-
await ConnectAsync(socket, endPoint, cancellationToken).ConfigureAwait(false);
98-
return CreateNetworkStream(socket);
102+
var socket = CreateSocket(targetEndpoint);
103+
await ConnectAsync(socket, targetEndpoint, cancellationToken).ConfigureAwait(false);
104+
var stream = CreateNetworkStream(socket);
105+
if (_settings.UseProxy)
106+
{
107+
Socks5Helper.PerformSocks5Handshake(stream, endPoint, _settings.ProxyUsername, _settings.ProxyPassword, cancellationToken);
108+
}
109+
110+
return stream;
99111
#else
100-
var resolved = await ResolveEndPointsAsync(endPoint).ConfigureAwait(false);
112+
var resolved = await ResolveEndPointsAsync(targetEndpoint).ConfigureAwait(false);
101113
for (int i = 0; i < resolved.Length; i++)
102114
{
103115
try
104116
{
105117
var socket = CreateSocket(resolved[i]);
106118
await ConnectAsync(socket, resolved[i], cancellationToken).ConfigureAwait(false);
107-
return CreateNetworkStream(socket);
119+
var stream = CreateNetworkStream(socket);
120+
121+
if (_settings.UseProxy)
122+
{
123+
Socks5Helper.PerformSocks5Handshake(stream, endPoint, _settings.ProxyUsername, _settings.ProxyPassword, cancellationToken);
124+
}
125+
126+
return stream;
108127
}
109128
catch
110129
{

tests/MongoDB.Driver.Tests/Specifications/socks5-support/Socks5SupportProseTests.cs

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
using System;
17+
using System.Threading.Tasks;
1718
using MongoDB.Bson;
1819
using MongoDB.Driver.Core.TestHelpers.Logging;
1920
using Xunit;
@@ -24,28 +25,42 @@ namespace MongoDB.Driver.Tests.Specifications.socks5_support
2425
[Trait("Category", "Integration")]
2526
public class Socks5SupportProseTests(ITestOutputHelper testOutputHelper) : LoggableTestClass(testOutputHelper)
2627
{
28+
//TODO Need be sure that the connection string tests are run.
2729

28-
// [Theory]
29-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&directConnection=true", false)]
30-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&directConnection=true", true)]
31-
// [InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1080", false)]
32-
// [InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081", true)]
33-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&proxyUsername=nonexistentuser&proxyPassword=badauth&directConnection=true", false)]
34-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&proxyUsername=nonexistentuser&proxyPassword=badauth&directConnection=true", true)]
35-
// [InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081&proxyUsername=nonexistentuser&proxyPassword=badauth", true)]
36-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&proxyUsername=username&proxyPassword=p4ssw0rd&directConnection=true", true)]
37-
// [InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&directConnection=true", true)]
38-
// [InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1080&proxyUsername=username&proxyPassword=p4ssw0rd", true)]
39-
// [InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081", true)]
40-
public void TestConnectionStrings(string connectionString, bool expectedResult)
30+
31+
[Theory]
32+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&directConnection=true", false)]
33+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&directConnection=true", true)]
34+
[InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1080", false)]
35+
[InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081", true)]
36+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&proxyUsername=nonexistentuser&proxyPassword=badauth&directConnection=true", false)]
37+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&proxyUsername=nonexistentuser&proxyPassword=badauth&directConnection=true", true)]
38+
[InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081&proxyUsername=nonexistentuser&proxyPassword=badauth", true)]
39+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1080&proxyUsername=username&proxyPassword=p4ssw0rd&directConnection=true", true)]
40+
[InlineData("mongodb://<mappedhost>/?proxyHost=localhost&proxyPort=1081&directConnection=true", true)]
41+
[InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1080&proxyUsername=username&proxyPassword=p4ssw0rd", true)]
42+
[InlineData("mongodb://<replicaset>/?proxyHost=localhost&proxyPort=1081", true)]
43+
public async Task TestConnectionStrings(string connectionString, bool expectedResult)
4144
{
42-
connectionString = connectionString.Replace("<mappedhost>", "localhost:27017");
43-
var client = new MongoClient(connectionString);
44-
var database = client.GetDatabase("admin");
45+
connectionString = connectionString.Replace("<mappedhost>", "localhost:27017").Replace("<replicaset>", "localhost:27017");
46+
var mongoClientSettings = MongoClientSettings.FromConnectionString(connectionString);
47+
mongoClientSettings.ServerSelectionTimeout = TimeSpan.FromSeconds(1.5);
48+
var client = new MongoClient(mongoClientSettings);
4549

50+
var database = client.GetDatabase("admin");
4651
var command = new BsonDocument("hello", 1);
47-
var result = database.RunCommand<BsonDocument>(command);
48-
Assert.NotEmpty(result);
52+
53+
if (expectedResult)
54+
{
55+
var result = await database.RunCommandAsync<BsonDocument>(command);
56+
Assert.NotEmpty(result);
57+
}
58+
else
59+
{
60+
var exception = Record.Exception(() => database.RunCommand<BsonDocument>(command));
61+
Assert.IsType<TimeoutException>(exception);
62+
}
63+
4964
}
5065

5166
}

0 commit comments

Comments
 (0)