Skip to content

Commit

Permalink
Add HttpPipelineUriBuilder (#5680)
Browse files Browse the repository at this point in the history
  • Loading branch information
pakrym authored Apr 9, 2019
1 parent 149dd1b commit 21fa993
Show file tree
Hide file tree
Showing 15 changed files with 457 additions and 104 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,7 @@ public async Task SetKeyValueLabel()
await service.DeleteAsync(key, label);
}
}

[Test]
public async Task GetRequestId()
{
Expand Down Expand Up @@ -745,6 +745,7 @@ public async Task GetBatchSettingWithFields()
{
await service.DeleteAsync(s_testSetting.Key, s_testSetting.Label);
}

}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public async Task Get()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Get, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key", request.UriBuilder.ToString());
Assert.AreEqual(s_testSetting, setting);
}

Expand All @@ -70,7 +70,7 @@ public async Task GetWithLabel()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Get, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.UriBuilder.ToString());
Assert.AreEqual(s_testSetting, setting);
}

Expand Down Expand Up @@ -103,7 +103,7 @@ public async Task Add()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Put, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.UriBuilder.ToString());
Assert.True(request.TryGetHeader("If-None-Match", out var ifNoneMatch));
Assert.AreEqual("*", ifNoneMatch);
AssertContent(SerializationHelpers.Serialize(s_testSetting, SerializeRequestSetting), request);
Expand All @@ -124,7 +124,7 @@ public async Task Set()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Put, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.UriBuilder.ToString());
AssertContent(SerializationHelpers.Serialize(s_testSetting, SerializeRequestSetting), request);
Assert.AreEqual(s_testSetting, setting);
}
Expand All @@ -143,7 +143,7 @@ public async Task Update()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Put, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.UriBuilder.ToString());
AssertContent(SerializationHelpers.Serialize(s_testSetting, SerializeRequestSetting), request);
Assert.AreEqual(s_testSetting, setting);
Assert.True(request.TryGetHeader("If-Match", out var ifMatch));
Expand All @@ -164,7 +164,7 @@ public async Task Delete()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Delete, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key", request.UriBuilder.ToString());
}

[Test]
Expand All @@ -181,7 +181,7 @@ public async Task DeleteWithLabel()

AssertRequestCommon(request);
Assert.AreEqual(HttpPipelineMethod.Delete, request.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/test_key?label=test_label", request.UriBuilder.ToString());
}

[Test]
Expand Down Expand Up @@ -248,12 +248,12 @@ public async Task GetBatch()

MockRequest request1 = mockTransport.Requests[0];
Assert.AreEqual(HttpPipelineMethod.Get, request1.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/?key=*&label=*", request1.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/?key=*&label=*", request1.UriBuilder.ToString());
AssertRequestCommon(request1);

MockRequest request2 = mockTransport.Requests[1];
Assert.AreEqual(HttpPipelineMethod.Get, request2.Method);
Assert.AreEqual("https://contoso.azconfig.io/kv/?key=*&label=*&after=5", request2.Uri.ToString());
Assert.AreEqual("https://contoso.azconfig.io/kv/?key=*&label=*&after=5", request2.UriBuilder.ToString());
AssertRequestCommon(request1);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ public void FilterReservedCharacter()
Labels = new List<string>() { "my_label", "label,label" },
};

var builder = new UriBuilder();
var builder = new HttpPipelineUriBuilder();
builder.Uri = new Uri("http://localhost/");
service.BuildBatchQuery(builder, selector);

Assert.AreEqual(builder.Uri.AbsoluteUri, @"http://localhost/?key=my_key,key%5C,key&label=my_label,label%5C,label");
Assert.AreEqual(@"http://localhost/?key=my_key,key%5C,key&label=my_label,label%5C,label", builder.Uri.AbsoluteUri);

}

Expand All @@ -50,10 +51,11 @@ public void FilterContains()
Labels = new List<string>() { "*label*" },
};

var builder = new UriBuilder();
var builder = new HttpPipelineUriBuilder();
builder.Uri = new Uri("http://localhost/");
service.BuildBatchQuery(builder, selector);

Assert.AreEqual(builder.Uri.AbsoluteUri, "http://localhost/?key=*key*&label=*label*");
Assert.AreEqual("http://localhost/?key=*key*&label=*label*", builder.Uri.AbsoluteUri);
}

[Test]
Expand All @@ -65,10 +67,11 @@ public void FilterNullLabel()
Labels = new List<string>() { "" },
};

var builder = new UriBuilder();
var builder = new HttpPipelineUriBuilder();
builder.Uri = new Uri("http://localhost/");
service.BuildBatchQuery(builder, selector);

Assert.AreEqual(builder.Uri.AbsoluteUri, "http://localhost/?key=*&label=%00");
Assert.AreEqual("http://localhost/?key=*&label=%00", builder.Uri.AbsoluteUri);
}

[Test]
Expand All @@ -79,10 +82,11 @@ public void FilterOnlyKey()
var key = "my-key";
var selector = new SettingSelector(key);

var builder = new UriBuilder();
var builder = new HttpPipelineUriBuilder();
builder.Uri = new Uri("http://localhost/");
service.BuildBatchQuery(builder, selector);

Assert.AreEqual(builder.Uri.AbsoluteUri, $"http://localhost/?key={key}");
Assert.AreEqual($"http://localhost/?key={key}", builder.Uri.AbsoluteUri);
}

[Test]
Expand All @@ -93,10 +97,11 @@ public void FilterOnlyLabel()
var label = "my-label";
var selector = new SettingSelector(null, label);

var builder = new UriBuilder();
var builder = new HttpPipelineUriBuilder();
builder.Uri = new Uri("http://localhost/");
service.BuildBatchQuery(builder, selector);

Assert.AreEqual(builder.Uri.AbsoluteUri, $"http://localhost/?key=*&label={label}");
Assert.AreEqual($"http://localhost/?key=*&label={label}", builder.Uri.AbsoluteUri);
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public override async Task ProcessAsync(HttpPipelineMessage message, ReadOnlyMem

using (var hmac = new HMACSHA256(_secret))
{
var uri = message.Request.Uri;
var uri = message.Request.UriBuilder.Uri;
var host = uri.Host;
var pathAndQuery = uri.PathAndQuery;

Expand All @@ -63,4 +63,4 @@ public override async Task ProcessAsync(HttpPipelineMessage message, ReadOnlyMem
}

}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ public async Task<Response<ConfigurationSetting>> AddAsync(ConfigurationSetting
if (setting == null) throw new ArgumentNullException(nameof(setting));
if (string.IsNullOrEmpty(setting.Key)) throw new ArgumentNullException($"{nameof(setting)}.{nameof(setting.Key)}");

Uri uri = BuildUriForKvRoute(setting);

using (var request = _pipeline.CreateRequest())
{
ReadOnlyMemory<byte> content = Serialize(setting);

request.SetRequestLine(HttpPipelineMethod.Put, uri);
request.Method = HttpPipelineMethod.Put;

BuildUriForKvRoute(request.UriBuilder, setting);

request.AddHeader(IfNoneMatch, "*");
request.AddHeader(MediaTypeKeyValueApplicationHeader);
Expand Down Expand Up @@ -81,14 +81,12 @@ public async Task<Response<ConfigurationSetting>> SetAsync(ConfigurationSetting
if (setting == null) throw new ArgumentNullException(nameof(setting));
if (string.IsNullOrEmpty(setting.Key)) throw new ArgumentNullException($"{nameof(setting)}.{nameof(setting.Key)}");

Uri uri = BuildUriForKvRoute(setting);

using (var request = _pipeline.CreateRequest())
{
ReadOnlyMemory<byte> content = Serialize(setting);

request.SetRequestLine(HttpPipelineMethod.Put, uri);

request.Method = HttpPipelineMethod.Put;
BuildUriForKvRoute(request.UriBuilder, setting);
request.AddHeader(MediaTypeKeyValueApplicationHeader);
request.AddHeader(HttpHeader.Common.JsonContentType);

Expand Down Expand Up @@ -120,14 +118,12 @@ public async Task<Response<ConfigurationSetting>> UpdateAsync(ConfigurationSetti
if (setting == null) throw new ArgumentNullException(nameof(setting));
if (string.IsNullOrEmpty(setting.Key)) throw new ArgumentNullException($"{nameof(setting)}.{nameof(setting.Key)}");

Uri uri = BuildUriForKvRoute(setting);

using (var request = _pipeline.CreateRequest())
{
ReadOnlyMemory<byte> content = Serialize(setting);

request.SetRequestLine(HttpPipelineMethod.Put, uri);

request.Method = HttpPipelineMethod.Put;
BuildUriForKvRoute(request.UriBuilder, setting);
request.AddHeader(MediaTypeKeyValueApplicationHeader);
request.AddHeader(HttpHeader.Common.JsonContentType);

Expand Down Expand Up @@ -162,11 +158,10 @@ public async Task<Response> DeleteAsync(string key, string label = default, ETag
{
if (string.IsNullOrEmpty(key)) throw new ArgumentNullException(nameof(key));

Uri uri = BuildUriForKvRoute(key, label);

using (var request = _pipeline.CreateRequest())
{
request.SetRequestLine(HttpPipelineMethod.Delete, uri);
request.Method = HttpPipelineMethod.Delete;
BuildUriForKvRoute(request.UriBuilder, key, label);

if (etag != default)
{
Expand All @@ -187,13 +182,12 @@ public async Task<Response<ConfigurationSetting>> GetAsync(string key, string la
{
if (string.IsNullOrEmpty(key)) throw new ArgumentNullException($"{nameof(key)}");

Uri uri = BuildUriForKvRoute(key, label);

using (var request = _pipeline.CreateRequest())
{
request.SetRequestLine(HttpPipelineMethod.Get, uri);

request.Method = HttpPipelineMethod.Get;
BuildUriForKvRoute(request.UriBuilder, key, label);
request.AddHeader(MediaTypeKeyValueApplicationHeader);

if (acceptDateTime != default)
{
var dateTime = acceptDateTime.UtcDateTime.ToString(AcceptDateTimeFormat);
Expand All @@ -212,12 +206,10 @@ public async Task<Response<ConfigurationSetting>> GetAsync(string key, string la

public async Task<Response<SettingBatch>> GetBatchAsync(SettingSelector selector, CancellationToken cancellation = default)
{
var uri = BuildUriForGetBatch(selector);

using (var request = _pipeline.CreateRequest())
{
request.SetRequestLine(HttpPipelineMethod.Get, uri);

request.Method = HttpPipelineMethod.Get;
BuildUriForGetBatch(request.UriBuilder, selector);
request.AddHeader(MediaTypeKeyValueApplicationHeader);
if (selector.AsOf.HasValue)
{
Expand All @@ -237,12 +229,10 @@ public async Task<Response<SettingBatch>> GetBatchAsync(SettingSelector selector

public async Task<Response<SettingBatch>> GetRevisionsAsync(SettingSelector selector, CancellationToken cancellation = default)
{
var uri = BuildUriForRevisions(selector);

using (var request = _pipeline.CreateRequest())
{
request.SetRequestLine(HttpPipelineMethod.Get, uri);

request.Method = HttpPipelineMethod.Get;
BuildUriForRevisions(request.UriBuilder, selector);
request.AddHeader(MediaTypeKeyValueApplicationHeader);
if (selector.AsOf.HasValue)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,20 +80,19 @@ static void ParseConnectionString(string connectionString, out Uri uri, out stri
};
}

Uri BuildUriForKvRoute(ConfigurationSetting keyValue)
=> BuildUriForKvRoute(keyValue.Key, keyValue.Label); // TODO (pri 2) : does this need to filter ETag?
void BuildUriForKvRoute(HttpPipelineUriBuilder builder, ConfigurationSetting keyValue)
=> BuildUriForKvRoute(builder, keyValue.Key, keyValue.Label); // TODO (pri 2) : does this need to filter ETag?

Uri BuildUriForKvRoute(string key, string label)
void BuildUriForKvRoute(HttpPipelineUriBuilder builder, string key, string label)
{
var builder = new UriBuilder(_baseUri);
builder.Path = KvRoute + key;
builder.Uri = _baseUri;
builder.AppendPath(KvRoute);
builder.AppendPath(key);

if (label != null)
{
builder.AppendQuery(LabelQueryFilter, label);
}

return builder.Uri;
}

private string EscapeReservedCharacters(string input)
Expand All @@ -113,7 +112,7 @@ private string EscapeReservedCharacters(string input)
return resp;
}

internal void BuildBatchQuery(UriBuilder builder, SettingSelector selector)
internal void BuildBatchQuery(HttpPipelineUriBuilder builder, SettingSelector selector)
{
if (selector.Keys.Count > 0)
{
Expand Down Expand Up @@ -163,22 +162,18 @@ internal void BuildBatchQuery(UriBuilder builder, SettingSelector selector)
}
}

Uri BuildUriForGetBatch(SettingSelector selector)
void BuildUriForGetBatch(HttpPipelineUriBuilder builder, SettingSelector selector)
{
var builder = new UriBuilder(_baseUri);
builder.Path = KvRoute;
builder.Uri = _baseUri;
builder.AppendPath(KvRoute);
BuildBatchQuery(builder, selector);

return builder.Uri;
}

Uri BuildUriForRevisions(SettingSelector selector)
void BuildUriForRevisions(HttpPipelineUriBuilder builder, SettingSelector selector)
{
var builder = new UriBuilder(_baseUri);
builder.Path = RevisionsRoute;
builder.Uri = _baseUri;
builder.AppendPath(RevisionsRoute);
BuildBatchQuery(builder, selector);

return builder.Uri;
}

static ReadOnlyMemory<byte> Serialize(ConfigurationSetting setting)
Expand Down Expand Up @@ -209,4 +204,4 @@ static ReadOnlyMemory<byte> Serialize(ConfigurationSetting setting)
public override string ToString() => base.ToString();
#endregion
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public async Task HostHeaderSetFromUri()

await ExecuteRequest(request, transport);

// HttpClientHandler would correctly set Host header from Uri when it's not set explicitly
// HttpClientHandler would correctly set Host header from UriBuilder when it's not set explicitly
Assert.AreEqual("http://example.com:340/", uri.ToString());
Assert.Null(host);
}
Expand Down Expand Up @@ -142,7 +142,7 @@ public async Task CanGetAndSetUri()
var request = transport.CreateRequest(null);
request.SetRequestLine(HttpPipelineMethod.Get, expectedUri);

Assert.AreEqual(expectedUri, request.Uri);
Assert.AreEqual(expectedUri.ToString(), request.UriBuilder.ToString());

await ExecuteRequest(request, transport);

Expand Down
Loading

0 comments on commit 21fa993

Please sign in to comment.