-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add htttp handler to facilitate custom headers
- Loading branch information
1 parent
12cf784
commit 20c9848
Showing
3 changed files
with
146 additions
and
9 deletions.
There are no files selected for viewing
41 changes: 41 additions & 0 deletions
41
src/Microsoft.Graph.Cli.Core.Tests/Http/HeaderStoreTests.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
using System.Linq; | ||
using Microsoft.Graph.Cli.Core.Http; | ||
using Xunit; | ||
|
||
namespace Microsoft.Graph.Cli.Core.Tests.Http; | ||
|
||
public class HeaderStoreTests | ||
{ | ||
[Fact] | ||
public void Stores_Single_Header() | ||
{ | ||
var header = new [] {"sample=header"}; | ||
HeadersStore.Instance.SetHeadersFromStrings(header); | ||
|
||
Assert.NotEmpty(HeadersStore.Instance.Headers); | ||
Assert.Equal(HeadersStore.Instance.Headers.Count(), 1); | ||
Assert.Equal(HeadersStore.Instance.Headers.First().Value.Count, 1); | ||
} | ||
|
||
[Fact] | ||
public void Stores_Multiple_Headers() | ||
{ | ||
var header = new [] {"sample=header", "sample2=header2", }; | ||
HeadersStore.Instance.SetHeadersFromStrings(header); | ||
|
||
Assert.NotEmpty(HeadersStore.Instance.Headers); | ||
Assert.Equal(HeadersStore.Instance.Headers.Count(), 2); | ||
Assert.Equal(HeadersStore.Instance.Headers.First().Value.Count, 1); | ||
} | ||
|
||
[Fact] | ||
public void Stores_Multiple_Headers_With_Matching_Key() | ||
{ | ||
var header = new [] {"sample=header", "sample=header2", }; | ||
HeadersStore.Instance.SetHeadersFromStrings(header); | ||
|
||
Assert.NotEmpty(HeadersStore.Instance.Headers); | ||
Assert.Equal(HeadersStore.Instance.Headers.Count(), 1); | ||
Assert.Equal(HeadersStore.Instance.Headers.First().Value.Count, 2); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,68 @@ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Net.Http; | ||
using System.Threading; | ||
using System.Threading.Tasks; | ||
|
||
namespace Microsoft.Graph.Cli.Core.Http; | ||
|
||
public class HttpHeadersHandler : DelegatingHandler | ||
{ | ||
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) | ||
{ | ||
foreach (var headerItem in HeadersStore.Instance.Headers) | ||
{ | ||
request.Headers.Add(headerItem.Key, headerItem.Value); | ||
} | ||
return base.SendAsync(request, cancellationToken); | ||
} | ||
} | ||
public sealed class HeadersStore | ||
{ | ||
private readonly Dictionary<string, List<string>> headers = new(); | ||
private static readonly Lazy<HeadersStore> lazy = | ||
new Lazy<HeadersStore>(() => new HeadersStore()); | ||
|
||
public static HeadersStore Instance { get { return lazy.Value; } } | ||
|
||
public IEnumerable<KeyValuePair<string, List<string>>> Headers { get { return headers; } } | ||
|
||
private HeadersStore() | ||
{ | ||
} | ||
|
||
public void SetHeadersFromStrings(string[] headers) | ||
{ | ||
this.headers.Clear(); | ||
|
||
var mapped = headers | ||
.Select<string, (string, string)?>(static h => | ||
{ | ||
var split = h.Split('=', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); | ||
if (split.Length < 1) | ||
{ | ||
return null; | ||
} | ||
var k = split[0]; | ||
var v = string.Empty; | ||
if (split.Length > 1) | ||
{ | ||
v = split[1]; | ||
} | ||
return (k, v); | ||
}); | ||
foreach (var kv in mapped) | ||
{ | ||
if (kv is { } nonNull) | ||
{ | ||
if (!this.headers.TryAdd(nonNull.Item1, new List<string> { nonNull.Item2 })) | ||
{ | ||
this.headers[nonNull.Item1].Add(nonNull.Item2); | ||
} | ||
} | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters