Skip to content

Commit 782c4c5

Browse files
authored
Merge pull request #131 from andreaTP/add-tryadd
Add a TryAdd method to Headers
2 parents cd20a6a + f33a7d3 commit 782c4c5

File tree

4 files changed

+105
-31
lines changed

4 files changed

+105
-31
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [1.3.4] - 2023-10-04
11+
12+
### Changed
13+
14+
- Added a TryAdd method on the RequestHeaders Dictionary
15+
1016
## [1.3.3] - 2023-09-25
1117

1218
### Changed

Microsoft.Kiota.Abstractions.Tests/RequestHeadersTests.cs

Lines changed: 53 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44

55
namespace Microsoft.Kiota.Abstractions.Tests;
66

7-
public class RequestHeadersTests {
7+
public class RequestHeadersTests
8+
{
89
[Fact]
9-
public void Defensive() {
10+
public void Defensive()
11+
{
1012
var instance = new RequestHeaders();
1113
Assert.Throws<ArgumentNullException>(() => instance.Add(null, "value"));
1214
Assert.Throws<ArgumentNullException>(() => instance.Add("name", (string[])null));
@@ -21,38 +23,69 @@ public void Defensive() {
2123
instance.ContainsKey(null);
2224
}
2325
[Fact]
24-
public void AddsToNonExistent() {
26+
public void AddsToNonExistent()
27+
{
2528
var instance = new RequestHeaders();
2629
instance.Add("name", "value");
27-
Assert.Equal(new [] { "value" }, instance["name"]);
30+
Assert.Equal(new[] { "value" }, instance["name"]);
2831
}
2932
[Fact]
30-
public void AddsToExistent() {
33+
public void TryAddsToNonExistent()
34+
{
35+
var instance = new RequestHeaders();
36+
var result = instance.TryAdd("name", "value");
37+
Assert.True(result);
38+
Assert.Equal(new[] { "value" }, instance["name"]);
39+
}
40+
[Fact]
41+
public void AddsToExistent()
42+
{
3143
var instance = new RequestHeaders();
3244
instance.Add("name", "value");
3345
instance.Add("name", "value2");
34-
Assert.Equal(new [] { "value", "value2" }, instance["name"]);
46+
Assert.Equal(new[] { "value", "value2" }, instance["name"]);
3547
}
3648
[Fact]
37-
public void AddsSingleValueHeaderToExistent() {
49+
public void TryAddsToExistent()
50+
{
51+
var instance = new RequestHeaders();
52+
var result = instance.TryAdd("name", "value");
53+
Assert.True(result);
54+
result = instance.TryAdd("name", "value2");
55+
Assert.False(result);
56+
Assert.Equal(new[] { "value" }, instance["name"]);
57+
}
58+
[Fact]
59+
public void AddsSingleValueHeaderToExistent()
60+
{
3861
var instance = new RequestHeaders();
3962
instance.Add("Content-Type", "value");
4063
instance.Add("Content-Type", "value2");
4164
Assert.Equal(new[] { "value2" }, instance["Content-Type"]);
4265
}
4366
[Fact]
44-
public void RemovesValue() {
67+
public void TryAddsSingleValueHeaderToExistent()
68+
{
69+
var instance = new RequestHeaders();
70+
instance.TryAdd("Content-Type", "value");
71+
instance.TryAdd("Content-Type", "value2");
72+
Assert.Equal(new[] { "value" }, instance["Content-Type"]);
73+
}
74+
[Fact]
75+
public void RemovesValue()
76+
{
4577
var instance = new RequestHeaders();
4678
instance.Remove("name", "value");
4779
instance.Add("name", "value");
4880
instance.Add("name", "value2");
4981
instance.Remove("name", "value");
50-
Assert.Equal(new [] { "value2" }, instance["name"]);
82+
Assert.Equal(new[] { "value2" }, instance["name"]);
5183
instance.Remove("name", "value2");
5284
Assert.Throws<KeyNotFoundException>(() => instance["name"]);
5385
}
5486
[Fact]
55-
public void Removes() {
87+
public void Removes()
88+
{
5689
var instance = new RequestHeaders();
5790
instance.Add("name", "value");
5891
instance.Add("name", "value2");
@@ -61,16 +94,18 @@ public void Removes() {
6194
Assert.False(instance.Remove("name"));
6295
}
6396
[Fact]
64-
public void RemovesKVP() {
97+
public void RemovesKVP()
98+
{
6599
var instance = new RequestHeaders();
66100
instance.Add("name", "value");
67101
instance.Add("name", "value2");
68-
Assert.True(instance.Remove(new KeyValuePair<string, IEnumerable<string>>("name", new [] { "value", "value2" })));
102+
Assert.True(instance.Remove(new KeyValuePair<string, IEnumerable<string>>("name", new[] { "value", "value2" })));
69103
Assert.Throws<KeyNotFoundException>(() => instance["name"]);
70104
Assert.False(instance.Remove("name"));
71105
}
72106
[Fact]
73-
public void Clears() {
107+
public void Clears()
108+
{
74109
var instance = new RequestHeaders();
75110
instance.Add("name", "value");
76111
instance.Add("name", "value2");
@@ -79,18 +114,20 @@ public void Clears() {
79114
Assert.Empty(instance.Keys);
80115
}
81116
[Fact]
82-
public void GetsEnumerator() {
117+
public void GetsEnumerator()
118+
{
83119
var instance = new RequestHeaders();
84120
instance.Add("name", "value");
85121
instance.Add("name", "value2");
86122
using var enumerator = instance.GetEnumerator();
87123
Assert.True(enumerator.MoveNext());
88124
Assert.Equal("name", enumerator.Current.Key);
89-
Assert.Equal(new [] { "value", "value2" }, enumerator.Current.Value);
125+
Assert.Equal(new[] { "value", "value2" }, enumerator.Current.Value);
90126
Assert.False(enumerator.MoveNext());
91127
}
92128
[Fact]
93-
public void Updates() {
129+
public void Updates()
130+
{
94131
var instance = new RequestHeaders();
95132
instance.Add("name", "value");
96133
instance.Add("name", "value2");

src/Microsoft.Kiota.Abstractions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PackageProjectUrl>https://aka.ms/kiota/docs</PackageProjectUrl>
1515
<EmbedUntrackedSources>true</EmbedUntrackedSources>
1616
<Deterministic>true</Deterministic>
17-
<VersionPrefix>1.3.3</VersionPrefix>
17+
<VersionPrefix>1.3.4</VersionPrefix>
1818
<VersionSuffix></VersionSuffix>
1919
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
2020
<SignAssembly>false</SignAssembly>

src/RequestHeaders.cs

Lines changed: 45 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@
66
namespace Microsoft.Kiota.Abstractions;
77

88
/// <summary>Represents a collection of request headers.</summary>
9-
public class RequestHeaders : IDictionary<string,IEnumerable<string>> {
9+
public class RequestHeaders : IDictionary<string, IEnumerable<string>>
10+
{
1011
private readonly Dictionary<string, HashSet<string>> _headers = new Dictionary<string, HashSet<string>>(StringComparer.OrdinalIgnoreCase);
1112
private readonly HashSet<string> _singleValueHeaders = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
1213
"Content-Type",
@@ -18,7 +19,8 @@ public class RequestHeaders : IDictionary<string,IEnumerable<string>> {
1819
/// </summary>
1920
/// <param name="headerName">The name of the header to add values to.</param>
2021
/// <param name="headerValues">The values to add to the header.</param>
21-
public void Add(string headerName, params string[] headerValues) {
22+
public void Add(string headerName, params string[] headerValues)
23+
{
2224
if(string.IsNullOrEmpty(headerName))
2325
throw new ArgumentNullException(nameof(headerName));
2426
if(headerValues == null)
@@ -33,6 +35,25 @@ public void Add(string headerName, params string[] headerValues) {
3335
else
3436
_headers.Add(headerName, new HashSet<string>(headerValues));
3537
}
38+
/// <summary>
39+
/// Adds values to the header with the specified name if it's not already present
40+
/// </summary>
41+
/// <param name="headerName">The name of the header to add values to.</param>
42+
/// <param name="headerValue">The values to add to the header.</param>
43+
/// <returns>If the headerValue have been added to the Dictionary.</returns>
44+
public bool TryAdd(string headerName, string headerValue)
45+
{
46+
if(string.IsNullOrEmpty(headerName))
47+
throw new ArgumentNullException(nameof(headerName));
48+
if(headerValue == null)
49+
throw new ArgumentNullException(nameof(headerValue));
50+
if(!_headers.ContainsKey(headerName))
51+
{
52+
_headers.Add(headerName, new HashSet<string> { headerValue });
53+
return true;
54+
}
55+
return false;
56+
}
3657
/// <inheritdoc/>
3758
public ICollection<string> Keys => _headers.Keys;
3859
/// <inheritdoc/>
@@ -49,14 +70,16 @@ public void Add(string headerName, params string[] headerValues) {
4970
/// </summary>
5071
/// <param name="headerName">The name of the header to remove the value from.</param>
5172
/// <param name="headerValue">The value to remove from the header.</param>
52-
public bool Remove(string headerName, string headerValue) {
73+
public bool Remove(string headerName, string headerValue)
74+
{
5375
if(string.IsNullOrEmpty(headerName))
5476
throw new ArgumentNullException(nameof(headerName));
5577
if(headerValue == null)
5678
throw new ArgumentNullException(nameof(headerValue));
57-
if(_headers.TryGetValue(headerName, out var values)) {
79+
if(_headers.TryGetValue(headerName, out var values))
80+
{
5881
var result = values.Remove(headerValue);
59-
if (!values.Any())
82+
if(!values.Any())
6083
_headers.Remove(headerName);
6184
return result;
6285
}
@@ -66,7 +89,8 @@ public bool Remove(string headerName, string headerValue) {
6689
/// Adds all the headers values from the specified headers collection.
6790
/// </summary>
6891
/// <param name="headers">The headers to update the current headers with.</param>
69-
public void AddAll(RequestHeaders headers) {
92+
public void AddAll(RequestHeaders headers)
93+
{
7094
if(headers == null)
7195
throw new ArgumentNullException(nameof(headers));
7296
foreach(var header in headers)
@@ -76,7 +100,8 @@ public void AddAll(RequestHeaders headers) {
76100
/// <summary>
77101
/// Removes all headers.
78102
/// </summary>
79-
public void Clear() {
103+
public void Clear()
104+
{
80105
_headers.Clear();
81106
}
82107
/// <inheritdoc/>
@@ -86,16 +111,19 @@ public void Clear() {
86111
public void Add(string key, IEnumerable<string> value) => Add(key, value?.ToArray());
87112
#pragma warning restore CS8604 // Possible null reference argument.
88113
/// <inheritdoc/>
89-
public bool Remove(string key) {
114+
public bool Remove(string key)
115+
{
90116
if(string.IsNullOrEmpty(key))
91117
throw new ArgumentNullException(nameof(key));
92118
return _headers.Remove(key);
93119
}
94120
/// <inheritdoc/>
95-
public bool TryGetValue(string key, out IEnumerable<string> value) {
121+
public bool TryGetValue(string key, out IEnumerable<string> value)
122+
{
96123
if(string.IsNullOrEmpty(key))
97124
throw new ArgumentNullException(nameof(key));
98-
if(_headers.TryGetValue(key, out var values)) {
125+
if(_headers.TryGetValue(key, out var values))
126+
{
99127
value = values;
100128
return true;
101129
}
@@ -109,16 +137,18 @@ public bool TryGetValue(string key, out IEnumerable<string> value) {
109137
/// <inheritdoc/>
110138
public void CopyTo(KeyValuePair<string, IEnumerable<string>>[] array, int arrayIndex) => throw new NotImplementedException();
111139
/// <inheritdoc/>
112-
public bool Remove(KeyValuePair<string, IEnumerable<string>> item) {
140+
public bool Remove(KeyValuePair<string, IEnumerable<string>> item)
141+
{
113142
var result = false;
114-
foreach (var value in item.Value)
143+
foreach(var value in item.Value)
115144
result |= Remove(item.Key, value);
116145
return result;
117146
}
118147
/// <inheritdoc/>
119148
public IEnumerator<KeyValuePair<string, IEnumerable<string>>> GetEnumerator() => new RequestHeadersEnumerator(_headers.GetEnumerator());
120149
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
121-
private sealed class RequestHeadersEnumerator : IEnumerator<KeyValuePair<string, IEnumerable<string>>> {
150+
private sealed class RequestHeadersEnumerator : IEnumerator<KeyValuePair<string, IEnumerable<string>>>
151+
{
122152
private readonly IEnumerator _enumerator;
123153
public RequestHeadersEnumerator(IEnumerator enumerator)
124154
{
@@ -128,7 +158,8 @@ public RequestHeadersEnumerator(IEnumerator enumerator)
128158

129159
object IEnumerator.Current => Current;
130160

131-
public void Dispose() {
161+
public void Dispose()
162+
{
132163
(_enumerator as IDisposable)?.Dispose();
133164
GC.SuppressFinalize(this);
134165
}

0 commit comments

Comments
 (0)