Skip to content

Commit 19e0030

Browse files
alefranzrynowak
authored andcommitted
HeaderPropagation Middleware: handle content headers
1 parent 4649449 commit 19e0030

File tree

2 files changed

+83
-4
lines changed

2 files changed

+83
-4
lines changed

src/Middleware/HeaderPropagation/src/HeaderPropagationMessageHandler.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,31 @@ protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage reques
5353
{
5454
var outputName = string.IsNullOrEmpty(entry?.OutboundHeaderName) ? headerName : entry.OutboundHeaderName;
5555

56-
if (!request.Headers.Contains(outputName) &&
57-
_values.Headers.TryGetValue(headerName, out var values) &&
58-
!StringValues.IsNullOrEmpty(values))
56+
var hasContent = request.Content != null;
57+
58+
if (!request.Headers.TryGetValues(outputName, out var _) &&
59+
!(hasContent && request.Content.Headers.TryGetValues(outputName, out var _)))
5960
{
60-
request.Headers.TryAddWithoutValidation(outputName, (string[])values);
61+
if (_values.Headers.TryGetValue(headerName, out var stringValues) &&
62+
!StringValues.IsNullOrEmpty(stringValues))
63+
{
64+
if (stringValues.Count == 1)
65+
{
66+
var value = (string)stringValues;
67+
if (!request.Headers.TryAddWithoutValidation(outputName, value) && hasContent)
68+
{
69+
request.Content.Headers.TryAddWithoutValidation(outputName, value);
70+
}
71+
}
72+
else
73+
{
74+
var values = (string[])stringValues;
75+
if (!request.Headers.TryAddWithoutValidation(outputName, values) && hasContent)
76+
{
77+
request.Content.Headers.TryAddWithoutValidation(outputName, values);
78+
}
79+
}
80+
}
6181
}
6282
}
6383

src/Middleware/HeaderPropagation/test/HeaderPropagationMessageHandlerTest.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,63 @@ public async Task HeaderInState_AddCorrectValue()
5252
Assert.Equal(new[] { "test" }, Handler.Headers.GetValues("out"));
5353
}
5454

55+
[Fact]
56+
public async Task HeaderInState_WithMultipleValues_AddAllValues()
57+
{
58+
// Arrange
59+
Configuration.Headers.Add("in", new HeaderPropagationEntry { OutboundHeaderName = "out" });
60+
State.Headers.Add("in", new[] { "one", "two" });
61+
62+
// Act
63+
await Client.SendAsync(new HttpRequestMessage());
64+
65+
// Assert
66+
Assert.True(Handler.Headers.Contains("out"));
67+
Assert.Equal(new[] { "one", "two" }, Handler.Headers.GetValues("out"));
68+
}
69+
70+
[Fact]
71+
public async Task HeaderInState_RequestWithContent_ContentHeaderPresent_DoesNotAddIt()
72+
{
73+
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Type" });
74+
State.Headers.Add("in", "test");
75+
76+
// Act
77+
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
78+
79+
// Assert
80+
Assert.True(Handler.Content.Headers.Contains("Content-Type"));
81+
Assert.Equal(new[] { "text/plain; charset=utf-8" }, Handler.Content.Headers.GetValues("Content-Type"));
82+
}
83+
84+
[Fact]
85+
public async Task HeaderInState_RequestWithContent_ContentHeaderNotPresent_AddValue()
86+
{
87+
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Language" });
88+
State.Headers.Add("in", "test");
89+
90+
// Act
91+
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
92+
93+
// Assert
94+
Assert.True(Handler.Content.Headers.Contains("Content-Language"));
95+
Assert.Equal(new[] { "test" }, Handler.Content.Headers.GetValues("Content-Language"));
96+
}
97+
98+
[Fact]
99+
public async Task HeaderInState_WithMultipleValues_RequestWithContent_ContentHeaderNotPresent_AddAllValues()
100+
{
101+
Configuration.Headers.Add("in", new HeaderPropagationEntry() { OutboundHeaderName = "Content-Language" });
102+
State.Headers.Add("in", new[] { "one", "two" });
103+
104+
// Act
105+
await Client.SendAsync(new HttpRequestMessage() { Content = new StringContent("test") });
106+
107+
// Assert
108+
Assert.True(Handler.Content.Headers.Contains("Content-Language"));
109+
Assert.Equal(new[] { "one", "two" }, Handler.Content.Headers.GetValues("Content-Language"));
110+
}
111+
55112
[Fact]
56113
public async Task HeaderInState_NoOutputName_UseInputName()
57114
{
@@ -168,11 +225,13 @@ public async Task NullEntryInConfiguration_AddCorrectValue()
168225
private class SimpleHandler : DelegatingHandler
169226
{
170227
public HttpHeaders Headers { get; private set; }
228+
public HttpContent Content { get; private set; }
171229

172230
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
173231
CancellationToken cancellationToken)
174232
{
175233
Headers = request.Headers;
234+
Content = request.Content;
176235
return Task.FromResult(new HttpResponseMessage());
177236
}
178237
}

0 commit comments

Comments
 (0)