From 13261f00266b9cbb595b42ae32d5e38a0931dbab Mon Sep 17 00:00:00 2001 From: Peter Wasonga Ombwa Date: Fri, 12 Apr 2019 16:35:05 -0700 Subject: [PATCH 1/2] Add request content headers to cloned http request. Add CloneAsync tests. --- .../HttpRequestMessageExtensions.cs | 14 +++++---- .../HttpRequestMessageExtensionsTests.cs | 30 +++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs b/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs index f19e3ff449a..f5f489ed7b2 100644 --- a/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs +++ b/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs @@ -61,20 +61,22 @@ internal static async Task CloneAsync(this HttpRequestMessag { var newRequest = new HttpRequestMessage(originalRequest.Method, originalRequest.RequestUri); + // Copy request headers. foreach (var header in originalRequest.Headers) - { newRequest.Headers.TryAddWithoutValidation(header.Key, header.Value); - } + // Copy request properties. foreach (var property in originalRequest.Properties) - { newRequest.Properties.Add(property); - } - // Set Content if previous request contains - if (originalRequest.Content != null && originalRequest.Content.Headers.ContentLength != 0) + // Set Content if previous request had one. + if (originalRequest.Content != null) { newRequest.Content = new StreamContent(await originalRequest.Content.ReadAsStreamAsync()); + + // Copy content headers. + foreach (var contentHeader in originalRequest.Content.Headers) + newRequest.Content.Headers.TryAddWithoutValidation(contentHeader.Key, contentHeader.Value); } return newRequest; diff --git a/tests/Microsoft.Graph.DotnetCore.Core.Test/Extensions/HttpRequestMessageExtensionsTests.cs b/tests/Microsoft.Graph.DotnetCore.Core.Test/Extensions/HttpRequestMessageExtensionsTests.cs index af00555dd0a..d84ca3d25e7 100644 --- a/tests/Microsoft.Graph.DotnetCore.Core.Test/Extensions/HttpRequestMessageExtensionsTests.cs +++ b/tests/Microsoft.Graph.DotnetCore.Core.Test/Extensions/HttpRequestMessageExtensionsTests.cs @@ -6,6 +6,8 @@ namespace Microsoft.Graph.DotnetCore.Core.Test.Extensions { using Microsoft.Graph.DotnetCore.Core.Test.Requests; using System.Net.Http; + using System.Text; + using System.Threading.Tasks; using Xunit; public class HttpRequestMessageExtensionsTests: BaseRequestTests { @@ -85,5 +87,33 @@ public void GetMiddlewareControl_ShouldReturnIMiddlewareOptionObject() Assert.NotNull(httpRequestMessage.GetMiddlewareOption()); } + + [Fact] + public async Task CloneAsync_WithEmptyHttpContent() + { + HttpRequestMessage originalRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com"); + + HttpRequestMessage clonedRequest = await originalRequest.CloneAsync(); + + Assert.NotNull(clonedRequest); + Assert.Equal(originalRequest.Method, clonedRequest.Method); + Assert.Equal(originalRequest.RequestUri, clonedRequest.RequestUri); + Assert.Null(clonedRequest.Content); + } + + [Fact] + public async Task CloneAsync_WithHttpContent() + { + HttpRequestMessage originalRequest = new HttpRequestMessage(HttpMethod.Post, "http://example.com"); + originalRequest.Content = new StringContent("Sample Content", Encoding.UTF8, "application/json"); + + HttpRequestMessage clonedRequest = await originalRequest.CloneAsync(); + + Assert.NotNull(clonedRequest); + Assert.Equal(originalRequest.Method, clonedRequest.Method); + Assert.Equal(originalRequest.RequestUri, clonedRequest.RequestUri); + Assert.Equal(await originalRequest.Content.ReadAsStringAsync(), await clonedRequest.Content.ReadAsStringAsync()); + Assert.Equal(originalRequest.Content.Headers.ContentType, clonedRequest.Content.Headers.ContentType); + } } } From 5439ba8a7f623522426b6f66bca236e0da765b14 Mon Sep 17 00:00:00 2001 From: Peter Wasonga Ombwa Date: Fri, 12 Apr 2019 16:51:10 -0700 Subject: [PATCH 2/2] Add check for null headers. --- .../Extensions/HttpRequestMessageExtensions.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs b/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs index f5f489ed7b2..ccefa563450 100644 --- a/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs +++ b/src/Microsoft.Graph.Core/Extensions/HttpRequestMessageExtensions.cs @@ -75,8 +75,9 @@ internal static async Task CloneAsync(this HttpRequestMessag newRequest.Content = new StreamContent(await originalRequest.Content.ReadAsStreamAsync()); // Copy content headers. - foreach (var contentHeader in originalRequest.Content.Headers) - newRequest.Content.Headers.TryAddWithoutValidation(contentHeader.Key, contentHeader.Value); + if (originalRequest.Content.Headers != null) + foreach (var contentHeader in originalRequest.Content.Headers) + newRequest.Content.Headers.TryAddWithoutValidation(contentHeader.Key, contentHeader.Value); } return newRequest;