Skip to content

Commit 061011c

Browse files
committed
Merge branch 'master' of github.com:alhardy/NEST
Changed order of CopyKeyValues to match failing unit tests Conflicts: src/Nest/Domain/Connection/Connection.cs src/Nest/Domain/Connection/ConnectionSettings.cs src/Nest/Domain/Connection/IConnectionSettings.cs
2 parents d90a816 + d3756e5 commit 061011c

File tree

12 files changed

+468
-143
lines changed

12 files changed

+468
-143
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
using NUnit.Framework;
2+
using System;
3+
using System.Collections.Specialized;
4+
5+
namespace Nest.Tests.Unit.Domain.Connection
6+
{
7+
using System.Net;
8+
9+
public class TestConnection : Nest.Connection
10+
{
11+
public TestConnection(IConnectionSettings settings)
12+
: base(settings) { }
13+
14+
public HttpWebRequest GetConnection(string path, string method)
15+
{
16+
return base.CreateConnection(path, method);
17+
}
18+
}
19+
20+
[TestFixture]
21+
public class ConnectionTests
22+
{
23+
[Test]
24+
public void CanCreateConnectionWithCustomQueryStringParameters()
25+
{
26+
// Arrange
27+
var uri = new Uri("http://localhost");
28+
var query = new NameValueCollection { { "authToken", "ABCDEFGHIJK" } };
29+
var connectionSettings = new ConnectionSettings(uri, query);
30+
var connection = new TestConnection(connectionSettings);
31+
32+
// Act
33+
var req = connection.GetConnection("/", "GET");
34+
35+
// Assert
36+
Assert.IsTrue(string.Compare(req.Address.ToString(), "http://localhost/?authToken=ABCDEFGHIJK", StringComparison.OrdinalIgnoreCase) == 0);
37+
}
38+
39+
[Test]
40+
public void CanCreateConnectionWithPathAndCustomQueryStringParameters()
41+
{
42+
// Arrange
43+
var uri = new Uri("http://localhost:9000");
44+
var query = new NameValueCollection { { "authToken", "ABCDEFGHIJK" } };
45+
var connectionSettings = new ConnectionSettings(uri, query);
46+
var connection = new TestConnection(connectionSettings);
47+
48+
// Act
49+
var req = connection.GetConnection("/index/", "GET");
50+
51+
// Assert
52+
Assert.IsTrue(string.Compare(req.Address.ToString(), "http://localhost:9000/index/?authToken=ABCDEFGHIJK", StringComparison.OrdinalIgnoreCase) == 0);
53+
}
54+
}
55+
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
using NUnit.Framework;
2+
using System;
3+
using System.Collections.Specialized;
4+
5+
namespace Nest.Tests.Unit.Extensions
6+
{
7+
[TestFixture]
8+
public class NameValueCollectionExtensions
9+
{
10+
[Test]
11+
public void CanCopyKeyValues()
12+
{
13+
// Arrange
14+
var source = new NameValueCollection { { "key1", "value1" }, { "key2", "value2" }, };
15+
var dest = new NameValueCollection();
16+
17+
// Act
18+
source.CopyKeyValues(dest);
19+
20+
// Assert
21+
Assert.IsTrue(dest["key1"] == "value1");
22+
Assert.IsTrue(dest["key2"] == "value2");
23+
}
24+
25+
[Test]
26+
public void UnableToCopyKeyValues()
27+
{
28+
// Arrange
29+
var source = new NameValueCollection { { "key1", "value1" }, { "key2", "value2" }, };
30+
var dest = new NameValueCollection();
31+
32+
// Act
33+
source.CopyKeyValues(dest);
34+
35+
// Assert
36+
Assert.IsTrue(dest["key1"] == "value1");
37+
Assert.IsTrue(dest["key2"] == "value2");
38+
}
39+
40+
[Test]
41+
public void CopyKeyValuesWithDuplicateKeyThrowException()
42+
{
43+
// Arrange
44+
var source = new NameValueCollection { { "key1", "value1" } };
45+
var dest = new NameValueCollection { { "key1", "value1" } };
46+
47+
// Act
48+
// Assert
49+
Assert.Throws<ApplicationException>(() => source.CopyKeyValues(dest));
50+
}
51+
52+
[Test]
53+
public void CanCovertNameValueCollectionToQueryString()
54+
{
55+
// Arrange
56+
var queryCollection = new NameValueCollection { { "key1", "value1" }, { "key2", "value2" }, };
57+
58+
// Act
59+
var queryString = queryCollection.ToQueryString();
60+
61+
// Assert
62+
Assert.IsTrue(queryString == "?key1=value1&key2=value2");
63+
}
64+
65+
[Test]
66+
public void ConvertEmptyNameValueCollectionToQueryStringReturnsEmptyString()
67+
{
68+
// Arrange
69+
var queryCollection = new NameValueCollection();
70+
71+
// Act
72+
var queryString = queryCollection.ToQueryString();
73+
74+
// Assert
75+
Assert.IsTrue(queryString == string.Empty);
76+
}
77+
}
78+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using NUnit.Framework;
2+
3+
namespace Nest.Tests.Unit.Extensions
4+
{
5+
[TestFixture]
6+
public class StringExtensionsTests
7+
{
8+
[Test]
9+
public void CanConvertQueryStringToNameValueCollectionWithQuestionMark()
10+
{
11+
// Arrange
12+
var queryString = "?test1=one&test2=two";
13+
14+
// Act
15+
var queryCollection = queryString.ToNameValueCollection();
16+
17+
// Assert
18+
Assert.IsTrue(queryCollection["test1"] == "one");
19+
Assert.IsTrue(queryCollection["test2"] == "two");
20+
}
21+
22+
[Test]
23+
public void CanConvertQueryStringToNameValueCollectionWithoutQuestionMark()
24+
{
25+
// Arrange
26+
var queryString = "test1=testone&test2=testtwo";
27+
28+
// Act
29+
var queryCollection = queryString.ToNameValueCollection();
30+
31+
// Assert
32+
Assert.IsTrue(queryCollection["test1"] == "testone");
33+
Assert.IsTrue(queryCollection["test2"] == "testtwo");
34+
}
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
using NUnit.Framework;
2+
using System;
3+
4+
namespace Nest.Tests.Unit.Extensions
5+
{
6+
[TestFixture]
7+
public class UriExtensionsTests
8+
{
9+
[Test]
10+
public void CanGetUrlForUriWithPort()
11+
{
12+
// Arrange
13+
var uri = new Uri("http://localhost:8080");
14+
15+
// Act
16+
var url = uri.ToUrlAndOverridePath("?test1=value1&test2=value2");
17+
18+
// Assert
19+
Assert.IsTrue(url == "http://localhost:8080?test1=value1&test2=value2");
20+
}
21+
22+
[Test]
23+
public void CanGetUrlForUriWithoutPort()
24+
{
25+
// Arrange
26+
var uri = new Uri("http://localhost/");
27+
28+
// Act
29+
var url = uri.ToUrlAndOverridePath("?test1=value1&test2=value2");
30+
31+
// Assert
32+
Assert.IsTrue(url == "http://localhost:80?test1=value1&test2=value2");
33+
}
34+
35+
}
36+
}

src/Nest.Tests.Unit/Nest.Tests.Unit.csproj

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@
7474
<Compile Include="Cluster\HealthTests.cs" />
7575
<Compile Include="Cluster\NodeTests.cs" />
7676
<Compile Include="Core\Bulk\BulkTests.cs" />
77+
<Compile Include="Core\Domain\Connection\ConnectionTests.cs" />
7778
<Compile Include="Core\MultiSearch\MultiSearchTests.cs" />
7879
<Compile Include="Core\Get\GetFullTests.cs" />
7980
<Compile Include="Core\Index\IndexTests.cs" />
@@ -98,6 +99,9 @@
9899
<Compile Include="Core\Template\PutTemplateRequestTests.cs" />
99100
<Compile Include="Core\Versioning\VersioningTests.cs" />
100101
<Compile Include="Core\Warmers\PutWarmerRequestTests.cs" />
102+
<Compile Include="Extensions\NameValueCollectionExtensions.cs" />
103+
<Compile Include="Extensions\StringExtensionsTests.cs" />
104+
<Compile Include="Extensions\UriExtensionsTests.cs" />
101105
<Compile Include="Internals\Inferno\HostNameWithPathTests.cs" />
102106
<Compile Include="Internals\Inferno\MapTypeNamesTests.cs" />
103107
<Compile Include="Internals\Serialize\OptOutTests.cs" />

src/Nest/Domain/Connection/Connection.cs

Lines changed: 33 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
using System;
2-
using System.Text;
2+
using System.Collections.Generic;
3+
using System.Collections.Specialized;
4+
using System.IO;
35
using System.Net;
6+
using System.Text;
47
using System.Threading;
5-
using System.IO;
68
using System.Threading.Tasks;
7-
using System.Collections.Generic;
89
using Nest.Domain.Connection;
910

1011
namespace Nest
@@ -202,9 +203,18 @@ protected virtual ConnectionStatus DoSynchronousRequest(HttpWebRequest request,
202203
RequestMethod = request.Method
203204
};
204205
tracer.SetResult(cs);
206+
207+
_ConnectionSettings.ConnectionStatusHandler(cs);
208+
205209
return cs;
206210
}
207211
}
212+
catch (WebException webException)
213+
{
214+
var cs = new ConnectionStatus(webException) { Request = data, RequestUrl = request.RequestUri.ToString(), RequestMethod = request.Method };
215+
_ConnectionSettings.ConnectionStatusHandler(cs);
216+
return cs;
217+
}
208218
}
209219

210220
protected virtual Task<ConnectionStatus> DoAsyncRequest(HttpWebRequest request, string data = null)
@@ -232,6 +242,7 @@ protected virtual Task<ConnectionStatus> DoAsyncRequest(HttpWebRequest request,
232242
this.Iterate(this._AsyncSteps(request, tcs, data), tcs);
233243
var cs = tcs.Task.Result;
234244
tracer.SetResult(cs);
245+
_ConnectionSettings.ConnectionStatusHandler(cs);
235246
return cs;
236247
}
237248
}, TaskCreationOptions.LongRunning);
@@ -326,11 +337,26 @@ public void Iterate(IEnumerable<Task> asyncIterator, TaskCompletionSource<Connec
326337

327338
private string _CreateUriString(string path)
328339
{
329-
var s = this._ConnectionSettings;
330-
if (!path.StartsWith("/"))
331-
path = "./" + path;
340+
var s = this._ConnectionSettings;
341+
if (!path.StartsWith("/"))
342+
path = "./" + path;
343+
344+
var uri = new Uri(s.Uri, path);
345+
var url = uri.ToString();
346+
347+
if (s.QueryStringParameters != null)
348+
{
349+
var existingParams = uri.Query.ToNameValueCollection();
350+
var appendedParams = new NameValueCollection();
351+
appendedParams.CopyKeyValues(existingParams);
352+
appendedParams.CopyKeyValues(s.QueryStringParameters);
353+
354+
var queryString = appendedParams.ToQueryString();
355+
356+
url = uri.ToUrlAndOverridePath(uri.PathAndQuery + queryString);
357+
}
332358

333-
return new Uri(s.Uri, path).ToString();
359+
return url;
334360
}
335361
}
336362
}

0 commit comments

Comments
 (0)