From eda98fdcd8a31e9c17bd6dd8f1b628a72c825fe9 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 18 Apr 2023 14:12:51 -0700 Subject: [PATCH] Add .NET 8 TFM, clean up new warnings --- .../BasicYarpSample/BasicYarpSample.csproj | 2 +- .../Yarp.Kubernetes.IngressController.csproj | 2 +- .../Ingress/Yarp.Kubernetes.Ingress.csproj | 2 +- .../Monitor/Yarp.Kubernetes.Monitor.csproj | 2 +- .../backend/backend.csproj | 2 +- .../Prometheus/HttpLoadApp/HttpLoadApp.csproj | 2 +- ...erseProxy.Metrics.Prometheus.Sample.csproj | 2 +- .../ReverseProxy.Auth.Sample.csproj | 2 +- .../ReverseProxy.Code.Sample.csproj | 2 +- .../ReverseProxy.Config.Sample.csproj | 2 +- .../ReverseProxy.ConfigFilter.Sample.csproj | 2 +- .../ReverseProxy.Direct.Sample.csproj | 2 +- ...verseProxy.HttpSysDelegation.Sample.csproj | 2 +- .../SampleHttpSysServer.csproj | 2 +- .../ReverseProxy.LetsEncrypt.Sample.csproj | 2 +- .../ReverseProxy.Metrics.Sample.csproj | 2 +- .../ReverseProxy.Minimal.Sample.csproj | 2 +- .../ReverseProxy.Transforms.Sample.csproj | 2 +- .../Controllers/HttpController.cs | 2 +- samples/SampleServer/SampleServer.csproj | 2 +- .../Yarp.Kubernetes.Controller.csproj | 2 +- src/ReverseProxy/Yarp.ReverseProxy.csproj | 2 +- .../Yarp.Telemetry.Consumption.csproj | 2 +- .../Yarp.Kubernetes.Tests.csproj | 2 +- .../HeaderTests.cs | 12 ++- .../Yarp.ReverseProxy.FunctionalTests.csproj | 2 +- .../Forwarder/HttpForwarderTests.cs | 73 +++++++++---------- .../Forwarder/HttpTransformerTests.cs | 2 +- .../Health/ActiveHealthCheckMonitorTests.cs | 10 +-- .../ConsecutiveFailuresHealthPolicyTests.cs | 2 +- .../Routing/HeaderMatcherPolicyTests.cs | 32 ++++---- .../Routing/QueryMatcherPolicyTests.cs | 20 ++--- .../BaseSessionAffinityPolicyTests.cs | 2 +- .../SessionAffinityMiddlewareTests.cs | 2 +- .../Transforms/RequestTransformTests.cs | 8 +- .../ResponseHeaderRemoveTransformTests.cs | 4 +- .../ResponseTrailerRemoveTransformTests.cs | 4 +- .../ResponseTrailersTransformTests.cs | 2 +- .../Transforms/ResponseTransformTests.cs | 2 +- .../CaseInsensitiveEqualHelperTests.cs | 4 +- .../Yarp.ReverseProxy.Tests.csproj | 2 +- test/Tests.Common/Yarp.Tests.Common.csproj | 2 +- 42 files changed, 120 insertions(+), 113 deletions(-) diff --git a/samples/BasicYarpSample/BasicYarpSample.csproj b/samples/BasicYarpSample/BasicYarpSample.csproj index 5f0fde613..7c1f90097 100644 --- a/samples/BasicYarpSample/BasicYarpSample.csproj +++ b/samples/BasicYarpSample/BasicYarpSample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 latest diff --git a/samples/KubernetesIngress.Sample/Combined/Yarp.Kubernetes.IngressController.csproj b/samples/KubernetesIngress.Sample/Combined/Yarp.Kubernetes.IngressController.csproj index eb08ea5d7..bb1c2d766 100644 --- a/samples/KubernetesIngress.Sample/Combined/Yarp.Kubernetes.IngressController.csproj +++ b/samples/KubernetesIngress.Sample/Combined/Yarp.Kubernetes.IngressController.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 78d1f3b4-abce-4c5a-b914-3321fab1f8d0 Linux $('System.TeamProject') != 'internal' diff --git a/samples/KubernetesIngress.Sample/Ingress/Yarp.Kubernetes.Ingress.csproj b/samples/KubernetesIngress.Sample/Ingress/Yarp.Kubernetes.Ingress.csproj index 434773a96..d64f7cfe7 100644 --- a/samples/KubernetesIngress.Sample/Ingress/Yarp.Kubernetes.Ingress.csproj +++ b/samples/KubernetesIngress.Sample/Ingress/Yarp.Kubernetes.Ingress.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 b2dc6cd7-acbb-4d65-ad19-74771ff3c80f Linux $('System.TeamProject') != 'internal' diff --git a/samples/KubernetesIngress.Sample/Monitor/Yarp.Kubernetes.Monitor.csproj b/samples/KubernetesIngress.Sample/Monitor/Yarp.Kubernetes.Monitor.csproj index ad8e79960..2b0c64cb3 100644 --- a/samples/KubernetesIngress.Sample/Monitor/Yarp.Kubernetes.Monitor.csproj +++ b/samples/KubernetesIngress.Sample/Monitor/Yarp.Kubernetes.Monitor.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 42f98116-26c4-4115-b6af-c5dec1f88c84 Linux $('System.TeamProject') != 'internal' diff --git a/samples/KubernetesIngress.Sample/backend/backend.csproj b/samples/KubernetesIngress.Sample/backend/backend.csproj index 230ea8a73..19f6c9057 100644 --- a/samples/KubernetesIngress.Sample/backend/backend.csproj +++ b/samples/KubernetesIngress.Sample/backend/backend.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Backend aaa98da6-d0d4-4ad6-9821-f66057413c3a Linux diff --git a/samples/Prometheus/HttpLoadApp/HttpLoadApp.csproj b/samples/Prometheus/HttpLoadApp/HttpLoadApp.csproj index ccf95c72d..cf5252b80 100644 --- a/samples/Prometheus/HttpLoadApp/HttpLoadApp.csproj +++ b/samples/Prometheus/HttpLoadApp/HttpLoadApp.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe diff --git a/samples/Prometheus/ReverseProxy.Metrics-Prometheus.Sample/ReverseProxy.Metrics.Prometheus.Sample.csproj b/samples/Prometheus/ReverseProxy.Metrics-Prometheus.Sample/ReverseProxy.Metrics.Prometheus.Sample.csproj index 367e4d60a..f10a6772a 100644 --- a/samples/Prometheus/ReverseProxy.Metrics-Prometheus.Sample/ReverseProxy.Metrics.Prometheus.Sample.csproj +++ b/samples/Prometheus/ReverseProxy.Metrics-Prometheus.Sample/ReverseProxy.Metrics.Prometheus.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.Auth.Sample/ReverseProxy.Auth.Sample.csproj b/samples/ReverseProxy.Auth.Sample/ReverseProxy.Auth.Sample.csproj index bd0837fa7..8167dfa96 100644 --- a/samples/ReverseProxy.Auth.Sample/ReverseProxy.Auth.Sample.csproj +++ b/samples/ReverseProxy.Auth.Sample/ReverseProxy.Auth.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.Code.Sample/ReverseProxy.Code.Sample.csproj b/samples/ReverseProxy.Code.Sample/ReverseProxy.Code.Sample.csproj index c4ce69a4a..5bedc5cea 100644 --- a/samples/ReverseProxy.Code.Sample/ReverseProxy.Code.Sample.csproj +++ b/samples/ReverseProxy.Code.Sample/ReverseProxy.Code.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.Config.Sample/ReverseProxy.Config.Sample.csproj b/samples/ReverseProxy.Config.Sample/ReverseProxy.Config.Sample.csproj index c4ce69a4a..5bedc5cea 100644 --- a/samples/ReverseProxy.Config.Sample/ReverseProxy.Config.Sample.csproj +++ b/samples/ReverseProxy.Config.Sample/ReverseProxy.Config.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.ConfigFilter.Sample/ReverseProxy.ConfigFilter.Sample.csproj b/samples/ReverseProxy.ConfigFilter.Sample/ReverseProxy.ConfigFilter.Sample.csproj index c4ce69a4a..5bedc5cea 100644 --- a/samples/ReverseProxy.ConfigFilter.Sample/ReverseProxy.ConfigFilter.Sample.csproj +++ b/samples/ReverseProxy.ConfigFilter.Sample/ReverseProxy.ConfigFilter.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.Direct.Sample/ReverseProxy.Direct.Sample.csproj b/samples/ReverseProxy.Direct.Sample/ReverseProxy.Direct.Sample.csproj index c4ce69a4a..5bedc5cea 100644 --- a/samples/ReverseProxy.Direct.Sample/ReverseProxy.Direct.Sample.csproj +++ b/samples/ReverseProxy.Direct.Sample/ReverseProxy.Direct.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.HttpSysDelegation.Sample/ReverseProxy/ReverseProxy.HttpSysDelegation.Sample.csproj b/samples/ReverseProxy.HttpSysDelegation.Sample/ReverseProxy/ReverseProxy.HttpSysDelegation.Sample.csproj index 366dcce3c..4c2e168cd 100644 --- a/samples/ReverseProxy.HttpSysDelegation.Sample/ReverseProxy/ReverseProxy.HttpSysDelegation.Sample.csproj +++ b/samples/ReverseProxy.HttpSysDelegation.Sample/ReverseProxy/ReverseProxy.HttpSysDelegation.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 enable enable diff --git a/samples/ReverseProxy.HttpSysDelegation.Sample/SampleHttpSysServer/SampleHttpSysServer.csproj b/samples/ReverseProxy.HttpSysDelegation.Sample/SampleHttpSysServer/SampleHttpSysServer.csproj index d40aa0ad8..5c5e35020 100644 --- a/samples/ReverseProxy.HttpSysDelegation.Sample/SampleHttpSysServer/SampleHttpSysServer.csproj +++ b/samples/ReverseProxy.HttpSysDelegation.Sample/SampleHttpSysServer/SampleHttpSysServer.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 enable enable diff --git a/samples/ReverseProxy.LetsEncrypt.Sample/ReverseProxy.LetsEncrypt.Sample.csproj b/samples/ReverseProxy.LetsEncrypt.Sample/ReverseProxy.LetsEncrypt.Sample.csproj index 0d8d2ff91..03a0079ae 100644 --- a/samples/ReverseProxy.LetsEncrypt.Sample/ReverseProxy.LetsEncrypt.Sample.csproj +++ b/samples/ReverseProxy.LetsEncrypt.Sample/ReverseProxy.LetsEncrypt.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 latest diff --git a/samples/ReverseProxy.Metrics.Sample/ReverseProxy.Metrics.Sample.csproj b/samples/ReverseProxy.Metrics.Sample/ReverseProxy.Metrics.Sample.csproj index a41e09e51..50945a473 100644 --- a/samples/ReverseProxy.Metrics.Sample/ReverseProxy.Metrics.Sample.csproj +++ b/samples/ReverseProxy.Metrics.Sample/ReverseProxy.Metrics.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/ReverseProxy.Minimal.Sample/ReverseProxy.Minimal.Sample.csproj b/samples/ReverseProxy.Minimal.Sample/ReverseProxy.Minimal.Sample.csproj index da6b0f2a2..382697d2a 100644 --- a/samples/ReverseProxy.Minimal.Sample/ReverseProxy.Minimal.Sample.csproj +++ b/samples/ReverseProxy.Minimal.Sample/ReverseProxy.Minimal.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 enable enable latest diff --git a/samples/ReverseProxy.Transforms.Sample/ReverseProxy.Transforms.Sample.csproj b/samples/ReverseProxy.Transforms.Sample/ReverseProxy.Transforms.Sample.csproj index c4ce69a4a..5bedc5cea 100644 --- a/samples/ReverseProxy.Transforms.Sample/ReverseProxy.Transforms.Sample.csproj +++ b/samples/ReverseProxy.Transforms.Sample/ReverseProxy.Transforms.Sample.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe Yarp.Sample latest diff --git a/samples/SampleServer/Controllers/HttpController.cs b/samples/SampleServer/Controllers/HttpController.cs index 35457227e..e72ebfcb6 100644 --- a/samples/SampleServer/Controllers/HttpController.cs +++ b/samples/SampleServer/Controllers/HttpController.cs @@ -68,7 +68,7 @@ public void Headers([FromBody] Dictionary headers) { foreach (var (key, value) in headers) { - Response.Headers.Add(key, value); + Response.Headers[key] = value; } } } diff --git a/samples/SampleServer/SampleServer.csproj b/samples/SampleServer/SampleServer.csproj index 0e5c6fc8d..26e52ad7e 100644 --- a/samples/SampleServer/SampleServer.csproj +++ b/samples/SampleServer/SampleServer.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Exe SampleServer diff --git a/src/Kubernetes.Controller/Yarp.Kubernetes.Controller.csproj b/src/Kubernetes.Controller/Yarp.Kubernetes.Controller.csproj index 13499bf00..9efa2ac64 100644 --- a/src/Kubernetes.Controller/Yarp.Kubernetes.Controller.csproj +++ b/src/Kubernetes.Controller/Yarp.Kubernetes.Controller.csproj @@ -2,7 +2,7 @@ Toolkit for building a Kubernetes Ingress Controller in .NET using the infrastructure from ASP.NET and .NET - net6.0;net7.0 + net6.0;net7.0;net8.0 Library $(NoWarn);CS8002 $('System.TeamProject') != 'internal' diff --git a/src/ReverseProxy/Yarp.ReverseProxy.csproj b/src/ReverseProxy/Yarp.ReverseProxy.csproj index b920e7ed8..9c6f72854 100644 --- a/src/ReverseProxy/Yarp.ReverseProxy.csproj +++ b/src/ReverseProxy/Yarp.ReverseProxy.csproj @@ -2,7 +2,7 @@ Reverse proxy toolkit for building fast proxy servers in .NET using the infrastructure from ASP.NET and .NET - net6.0;net7.0 + net6.0;net7.0;net8.0 Library Yarp.ReverseProxy true diff --git a/src/TelemetryConsumption/Yarp.Telemetry.Consumption.csproj b/src/TelemetryConsumption/Yarp.Telemetry.Consumption.csproj index 697d1128b..6ffe2ab29 100644 --- a/src/TelemetryConsumption/Yarp.Telemetry.Consumption.csproj +++ b/src/TelemetryConsumption/Yarp.Telemetry.Consumption.csproj @@ -2,7 +2,7 @@ Yarp.ReverseProxy extension package for in-process telemetry consumption - net6.0;net7.0 + net6.0;net7.0;net8.0 Library Yarp.Telemetry.Consumption enable diff --git a/test/Kubernetes.Tests/Yarp.Kubernetes.Tests.csproj b/test/Kubernetes.Tests/Yarp.Kubernetes.Tests.csproj index 9a50d463c..38bff0e87 100644 --- a/test/Kubernetes.Tests/Yarp.Kubernetes.Tests.csproj +++ b/test/Kubernetes.Tests/Yarp.Kubernetes.Tests.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Library $(NoWarn);CS8002 Yarp.Kubernetes diff --git a/test/ReverseProxy.FunctionalTests/HeaderTests.cs b/test/ReverseProxy.FunctionalTests/HeaderTests.cs index 644822cf6..3232fbad6 100644 --- a/test/ReverseProxy.FunctionalTests/HeaderTests.cs +++ b/test/ReverseProxy.FunctionalTests/HeaderTests.cs @@ -136,8 +136,8 @@ public async Task ProxyAsync_EmptyResponseHeader_Proxied() var test = new TestEnvironment( context => { - context.Response.Headers.Add(HeaderNames.WWWAuthenticate, ""); - context.Response.Headers.Add("custom", ""); + context.Response.Headers[HeaderNames.WWWAuthenticate] = ""; + context.Response.Headers["custom"] = ""; return Task.CompletedTask; }) { @@ -427,7 +427,15 @@ public async Task ContentLengthAndTransferEncoding_ContentLengthRemoved() { try { +#if NET8_0_OR_GREATER + // Removed by the server + Assert.Null(context.Request.ContentLength); + // Set it just to make sure YARP removes it + context.Request.ContentLength = 11; +#else + // Fixed in 8.0 https://github.com/dotnet/aspnetcore/issues/43523 Assert.Equal(11, context.Request.ContentLength); +#endif Assert.Equal("chunked", context.Request.Headers[HeaderNames.TransferEncoding]); proxyTcs.SetResult(0); } diff --git a/test/ReverseProxy.FunctionalTests/Yarp.ReverseProxy.FunctionalTests.csproj b/test/ReverseProxy.FunctionalTests/Yarp.ReverseProxy.FunctionalTests.csproj index 96cc731b7..31ddacbe6 100644 --- a/test/ReverseProxy.FunctionalTests/Yarp.ReverseProxy.FunctionalTests.csproj +++ b/test/ReverseProxy.FunctionalTests/Yarp.ReverseProxy.FunctionalTests.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Library Yarp.ReverseProxy diff --git a/test/ReverseProxy.Tests/Forwarder/HttpForwarderTests.cs b/test/ReverseProxy.Tests/Forwarder/HttpForwarderTests.cs index ed4e0861d..108b19b4a 100644 --- a/test/ReverseProxy.Tests/Forwarder/HttpForwarderTests.cs +++ b/test/ReverseProxy.Tests/Forwarder/HttpForwarderTests.cs @@ -66,12 +66,12 @@ public async Task NormalRequest_Works() httpContext.Request.Path = "/path/base/dropped"; httpContext.Request.Path = "/api/test"; httpContext.Request.QueryString = new QueryString("?a=b&c=d"); - httpContext.Request.Headers.Add(":authority", "example.com:3456"); - httpContext.Request.Headers.Add("x-ms-request-test", "request"); - httpContext.Request.Headers.Add("Content-Language", "requestLanguage"); + httpContext.Request.Headers[":authority"] = "example.com:3456"; + httpContext.Request.Headers["x-ms-request-test"] = "request"; + httpContext.Request.Headers["Content-Language"] = "requestLanguage"; var requestBody = "request content"; - httpContext.Request.Headers.Add("Content-Length", requestBody.Length.ToString()); + httpContext.Request.Headers["Content-Length"] = requestBody.Length.ToString(); httpContext.Request.Body = StringToStream(requestBody); httpContext.Connection.RemoteIpAddress = IPAddress.Loopback; @@ -141,9 +141,9 @@ public async Task NormalRequestWithTransforms_Works() httpContext.Request.Path = "/path/base/dropped"; httpContext.Request.Path = "/api/test"; httpContext.Request.QueryString = new QueryString("?a=b&c=d"); - httpContext.Request.Headers.Add(":authority", "example.com:3456"); - httpContext.Request.Headers.Add("x-ms-request-test", "request"); - httpContext.Request.Headers.Add("Content-Language", "requestLanguage"); + httpContext.Request.Headers[":authority"] = "example.com:3456"; + httpContext.Request.Headers["x-ms-request-test"] = "request"; + httpContext.Request.Headers["Content-Language"] = "requestLanguage"; httpContext.Request.Body = StringToStream("request content"); httpContext.Connection.RemoteIpAddress = IPAddress.Loopback; httpContext.Features.Set(new TestTrailersFeature()); @@ -242,10 +242,10 @@ public async Task NormalRequestWithCopyRequestHeadersDisabled_Works() httpContext.Request.PathBase = "/api"; httpContext.Request.Path = "/test"; httpContext.Request.QueryString = new QueryString("?a=b&c=d"); - httpContext.Request.Headers.Add(":authority", "example.com:3456"); - httpContext.Request.Headers.Add("x-ms-request-test", "request"); - httpContext.Request.Headers.Add("Content-Language", "requestLanguage"); - httpContext.Request.Headers.Add("Transfer-Encoding", "chunked"); + httpContext.Request.Headers[":authority"] = "example.com:3456"; + httpContext.Request.Headers["x-ms-request-test"] = "request"; + httpContext.Request.Headers["Content-Language"] = "requestLanguage"; + httpContext.Request.Headers["Transfer-Encoding"] = "chunked"; httpContext.Request.Body = StringToStream("request content"); httpContext.Connection.RemoteIpAddress = IPAddress.Loopback; @@ -403,7 +403,7 @@ public async Task TransformRequestAsync_SetsStatus_ShortCircuits() Assert.Equal(StatusCodes.Status401Unauthorized, httpContext.Response.StatusCode); AssertProxyStartStop(events, destinationPrefix, httpContext.Response.StatusCode); - events.AssertContainProxyStages(new ForwarderStage[0]); + events.AssertContainProxyStages(Array.Empty()); } [Fact] @@ -443,7 +443,7 @@ public async Task TransformRequestAsync_StartsResponse_ShortCircuits() Assert.True(httpContext.Response.HasStarted); AssertProxyStartStop(events, destinationPrefix, httpContext.Response.StatusCode); - events.AssertContainProxyStages(new ForwarderStage[0]); + events.AssertContainProxyStages(Array.Empty()); } [Fact] @@ -485,7 +485,7 @@ public async Task TransformRequestAsync_WritesToResponse_ShortCircuits() Assert.Equal("Hello World", Encoding.UTF8.GetString(resultStream.ToArray())); AssertProxyStartStop(events, destinationPrefix, httpContext.Response.StatusCode); - events.AssertContainProxyStages(new ForwarderStage[0]); + events.AssertContainProxyStages(Array.Empty()); } // Tests proxying an upgradeable request. @@ -502,13 +502,13 @@ public async Task UpgradableRequest_Works(string upgradeHeader) httpContext.Request.Host = new HostString("example.com:3456"); httpContext.Request.Path = "/api/test"; httpContext.Request.QueryString = new QueryString("?a=b&c=d"); - httpContext.Request.Headers.Add(":authority", "example.com:3456"); - httpContext.Request.Headers.Add("x-ms-request-test", "request"); + httpContext.Request.Headers[":authority"] = "example.com:3456"; + httpContext.Request.Headers["x-ms-request-test"] = "request"; httpContext.Connection.RemoteIpAddress = IPAddress.Loopback; // TODO: https://github.com/microsoft/reverse-proxy/issues/255 // https://github.com/microsoft/reverse-proxy/issues/467 - httpContext.Request.Headers.Add("Upgrade", upgradeHeader); + httpContext.Request.Headers["Upgrade"] = upgradeHeader; var downstreamStream = new DuplexStream( readStream: StringToStream("request content"), @@ -580,11 +580,10 @@ public async Task UpgradableRequestFailsToUpgrade_ProxiesResponse() httpContext.Request.Host = new HostString("example.com"); httpContext.Request.Path = "/api/test"; httpContext.Request.QueryString = new QueryString("?a=b&c=d"); - httpContext.Request.Headers.Add(":host", "example.com"); - httpContext.Request.Headers.Add("x-ms-request-test", "request"); - + httpContext.Request.Headers[":host"] = "example.com"; + httpContext.Request.Headers["x-ms-request-test"] = "request"; // TODO: https://github.com/microsoft/reverse-proxy/issues/255 - httpContext.Request.Headers.Add("Upgrade", "WebSocket"); + httpContext.Request.Headers["Upgrade"] = "WebSocket"; var proxyResponseStream = new MemoryStream(); httpContext.Response.Body = proxyResponseStream; @@ -648,15 +647,15 @@ public async Task UpgradableRequest_CancelsIfIdle() // TODO: https://github.com/microsoft/reverse-proxy/issues/255 // https://github.com/microsoft/reverse-proxy/issues/467 - httpContext.Request.Headers.Add("Upgrade", "WebSocket"); + httpContext.Request.Headers["Upgrade"] = "WebSocket"; - var _idleTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + var idleTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); var downstreamStream = new DuplexStream( readStream: new StallStream(ct => { - ct.Register(() => _idleTcs.TrySetCanceled()); - return _idleTcs.Task; + ct.Register(() => idleTcs.TrySetCanceled()); + return idleTcs.Task; }), writeStream: new MemoryStream()); DuplexStream upstreamStream = null; @@ -682,8 +681,8 @@ public async Task UpgradableRequest_CancelsIfIdle() upstreamStream = new DuplexStream( readStream: new StallStream(ct => { - ct.Register(() => _idleTcs.TrySetCanceled()); - return _idleTcs.Task; + ct.Register(() => idleTcs.TrySetCanceled()); + return idleTcs.Task; }), writeStream: new MemoryStream()); response.Content = new RawStreamContent(upstreamStream); @@ -762,7 +761,7 @@ public async Task RequestWithoutBodies_NoHttpContent(string method, string proto { Assert.NotNull(request.Content); Assert.IsType(request.Content); - Assert.Empty(await request.Content.ReadAsByteArrayAsync()); + Assert.Empty(await request.Content.ReadAsByteArrayAsync(cancellationToken)); foreach (var (key, value) in headers) { @@ -1013,7 +1012,7 @@ public async Task RequestWithCookieHeaders(params string[] cookies) var httpContext = new DefaultHttpContext(); httpContext.Request.Method = "GET"; - httpContext.Request.Headers.Add(HeaderNames.Cookie, cookies); + httpContext.Request.Headers[HeaderNames.Cookie] = cookies; var destinationPrefix = "https://localhost/"; var sut = CreateProxy(); @@ -1052,7 +1051,7 @@ public async Task RequestWithMultiHeaders(string version, string headerName, str var httpContext = new DefaultHttpContext(); httpContext.Request.Method = "GET"; - httpContext.Request.Headers.Add(headerName, headers); + httpContext.Request.Headers[headerName] = headers; var destinationPrefix = "https://localhost/"; var sut = CreateProxy(); @@ -1095,7 +1094,7 @@ public async Task RequestWithEmptyMultiHeaders(string version, string headerName var httpContext = new DefaultHttpContext(); httpContext.Request.Method = "GET"; - httpContext.Request.Headers.Add(headerName, headers); + httpContext.Request.Headers[headerName] = headers; var destinationPrefix = "https://localhost/"; var sut = CreateProxy(); @@ -2199,7 +2198,7 @@ public async Task UpgradableRequest_RequestBodyCopyError_CancelsResponseBody() httpContext.Request.Scheme = "http"; httpContext.Request.Host = new HostString("example.com:3456"); // TODO: https://github.com/microsoft/reverse-proxy/issues/255 - httpContext.Request.Headers.Add("Upgrade", "WebSocket"); + httpContext.Request.Headers["Upgrade"] = "WebSocket"; var downstreamStream = new DuplexStream( readStream: new ThrowStream(), @@ -2259,7 +2258,7 @@ public async Task UpgradableRequest_ResponseBodyCopyError_CancelsRequestBody() httpContext.Request.Scheme = "http"; httpContext.Request.Host = new HostString("example.com:3456"); // TODO: https://github.com/microsoft/reverse-proxy/issues/255 - httpContext.Request.Headers.Add("Upgrade", "WebSocket"); + httpContext.Request.Headers["Upgrade"] = "WebSocket"; var downstreamStream = new DuplexStream( readStream: new StallStream(ct => @@ -2838,7 +2837,7 @@ private static string StreamToString(Stream stream) private static (string Name, string Values) GetHeaderNameAndValues(string fullHeader) { var headerNameEnd = fullHeader.IndexOf(": "); - return (fullHeader.Substring(0, headerNameEnd), fullHeader.Substring(headerNameEnd + 2)); + return (fullHeader[..headerNameEnd], fullHeader[(headerNameEnd + 2)..]); } private class DuplexStream : Stream @@ -2915,16 +2914,16 @@ public override void SetLength(long value) /// private class RawStreamContent : HttpContent { - private readonly Stream stream; + private readonly Stream _stream; public RawStreamContent(Stream stream) { - this.stream = stream ?? throw new ArgumentNullException(nameof(stream)); + _stream = stream ?? throw new ArgumentNullException(nameof(stream)); } protected override Task CreateContentReadStreamAsync() { - return Task.FromResult(stream); + return Task.FromResult(_stream); } protected override Task SerializeToStreamAsync(Stream stream, TransportContext context) diff --git a/test/ReverseProxy.Tests/Forwarder/HttpTransformerTests.cs b/test/ReverseProxy.Tests/Forwarder/HttpTransformerTests.cs index 190e7813f..2c6c038c3 100644 --- a/test/ReverseProxy.Tests/Forwarder/HttpTransformerTests.cs +++ b/test/ReverseProxy.Tests/Forwarder/HttpTransformerTests.cs @@ -129,7 +129,7 @@ public async Task TransformResponseAsync_ContentLength0OnBodylessStatusCode_Cont var proxyResponse = new HttpResponseMessage(statusCode) { - Content = new ByteArrayContent(new byte[0]) + Content = new ByteArrayContent(Array.Empty()) }; Assert.Equal(0, proxyResponse.Content.Headers.ContentLength); diff --git a/test/ReverseProxy.Tests/Health/ActiveHealthCheckMonitorTests.cs b/test/ReverseProxy.Tests/Health/ActiveHealthCheckMonitorTests.cs index efb1e8ca1..222fa8ab1 100644 --- a/test/ReverseProxy.Tests/Health/ActiveHealthCheckMonitorTests.cs +++ b/test/ReverseProxy.Tests/Health/ActiveHealthCheckMonitorTests.cs @@ -105,7 +105,7 @@ public async Task ProbeCluster_ProbingTimerFired_SendProbesAndReceiveResponses() Assert.False(monitor.InitialProbeCompleted); - await monitor.CheckHealthAsync(new ClusterState[0]); + await monitor.CheckHealthAsync(Array.Empty()); Assert.True(monitor.InitialProbeCompleted); @@ -140,7 +140,7 @@ public async Task ProbeCluster_ClusterRemoved_StopSendingProbes() Assert.False(monitor.InitialProbeCompleted); - await monitor.CheckHealthAsync(new ClusterState[0]); + await monitor.CheckHealthAsync(Array.Empty()); Assert.True(monitor.InitialProbeCompleted); @@ -181,7 +181,7 @@ public async Task ProbeCluster_ClusterAdded_StartSendingProbes() Assert.False(monitor.InitialProbeCompleted); - await monitor.CheckHealthAsync(new ClusterState[0]); + await monitor.CheckHealthAsync(Array.Empty()); Assert.True(monitor.InitialProbeCompleted); @@ -226,7 +226,7 @@ public async Task ProbeCluster_ClusterChanged_SendProbesToNewHealthEndpoint() Assert.False(monitor.InitialProbeCompleted); - await monitor.CheckHealthAsync(new ClusterState[0]); + await monitor.CheckHealthAsync(Array.Empty()); Assert.True(monitor.InitialProbeCompleted); @@ -277,7 +277,7 @@ public async Task ProbeCluster_ClusterChanged_StopSendingProbes() Assert.False(monitor.InitialProbeCompleted); - await monitor.CheckHealthAsync(new ClusterState[0]); + await monitor.CheckHealthAsync(Array.Empty()); Assert.True(monitor.InitialProbeCompleted); diff --git a/test/ReverseProxy.Tests/Health/ConsecutiveFailuresHealthPolicyTests.cs b/test/ReverseProxy.Tests/Health/ConsecutiveFailuresHealthPolicyTests.cs index fdd89d5c1..3b472c4a3 100644 --- a/test/ReverseProxy.Tests/Health/ConsecutiveFailuresHealthPolicyTests.cs +++ b/test/ReverseProxy.Tests/Health/ConsecutiveFailuresHealthPolicyTests.cs @@ -111,7 +111,7 @@ public void ProbingCompleted_EmptyProbingResultList_DoNothing() Assert.Equal(DestinationHealth.Unhealthy, cluster.Destinations.Values.First().Health.Active); Assert.Equal(DestinationHealth.Healthy, cluster.Destinations.Values.Skip(1).First().Health.Active); - policy.ProbingCompleted(cluster, new DestinationProbingResult[0]); + policy.ProbingCompleted(cluster, Array.Empty()); Assert.Equal(DestinationHealth.Unhealthy, cluster.Destinations.Values.First().Health.Active); Assert.Equal(DestinationHealth.Healthy, cluster.Destinations.Values.Skip(1).First().Health.Active); diff --git a/test/ReverseProxy.Tests/Routing/HeaderMatcherPolicyTests.cs b/test/ReverseProxy.Tests/Routing/HeaderMatcherPolicyTests.cs index 98277626b..0607dc5ff 100644 --- a/test/ReverseProxy.Tests/Routing/HeaderMatcherPolicyTests.cs +++ b/test/ReverseProxy.Tests/Routing/HeaderMatcherPolicyTests.cs @@ -33,10 +33,10 @@ public void Comparer_SortOrder_SingleRuleEqual() (0, CreateEndpoint("header", new[] { "abc", "def" }, HeaderMatchMode.HeaderPrefix)), (0, CreateEndpoint("header2", new[] { "abc", "def" }, HeaderMatchMode.HeaderPrefix)), - (0, CreateEndpoint("header", new string[0], HeaderMatchMode.Exists, isCaseSensitive: true)), - (0, CreateEndpoint("header", new string[0], HeaderMatchMode.Exists)), - (0, CreateEndpoint("header", new string[0], HeaderMatchMode.Exists, isCaseSensitive: true)), - (0, CreateEndpoint("header", new string[0], HeaderMatchMode.Exists)), + (0, CreateEndpoint("header", Array.Empty(), HeaderMatchMode.Exists, isCaseSensitive: true)), + (0, CreateEndpoint("header", Array.Empty(), HeaderMatchMode.Exists)), + (0, CreateEndpoint("header", Array.Empty(), HeaderMatchMode.Exists, isCaseSensitive: true)), + (0, CreateEndpoint("header", Array.Empty(), HeaderMatchMode.Exists)), }; var sut = new HeaderMatcherPolicy(); @@ -67,7 +67,7 @@ public void Comparer_MultipleHeaders_SortOrder() { (0, CreateEndpoint(new[] { - new HeaderMatcher("header", new string[0], HeaderMatchMode.Exists, isCaseSensitive: true), + new HeaderMatcher("header", Array.Empty(), HeaderMatchMode.Exists, isCaseSensitive: true), new HeaderMatcher("header", new[] { "abc" }, HeaderMatchMode.HeaderPrefix, isCaseSensitive: true), new HeaderMatcher("header", new[] { "cbcabc" }, HeaderMatchMode.Contains, isCaseSensitive: true), new HeaderMatcher("header", new[] { "abc" }, HeaderMatchMode.ExactHeader, isCaseSensitive: true) @@ -80,7 +80,7 @@ public void Comparer_MultipleHeaders_SortOrder() })), (1, CreateEndpoint(new[] { - new HeaderMatcher("header", new string[0], HeaderMatchMode.Exists, isCaseSensitive: true), + new HeaderMatcher("header", Array.Empty(), HeaderMatchMode.Exists, isCaseSensitive: true), new HeaderMatcher("header", new[] { "abc" }, HeaderMatchMode.ExactHeader, isCaseSensitive: true) })), @@ -115,15 +115,15 @@ public void AppliesToEndpoints_AppliesScenarios() { var scenarios = new[] { - CreateEndpoint("org-id", new string[0], HeaderMatchMode.Exists), + CreateEndpoint("org-id", Array.Empty(), HeaderMatchMode.Exists), CreateEndpoint("org-id", new[] { "abc" }), CreateEndpoint("org-id", new[] { "abc", "def" }), - CreateEndpoint("org-id", new string[0], HeaderMatchMode.Exists, isDynamic: true), + CreateEndpoint("org-id", Array.Empty(), HeaderMatchMode.Exists, isDynamic: true), CreateEndpoint("org-id", new[] { "abc" }, isDynamic: true), CreateEndpoint("org-id", null, HeaderMatchMode.Exists, isDynamic: true), CreateEndpoint(new[] { - new HeaderMatcher("header", new string[0], HeaderMatchMode.Exists, isCaseSensitive: true), + new HeaderMatcher("header", Array.Empty(), HeaderMatchMode.Exists, isCaseSensitive: true), new HeaderMatcher("header", new[] { "abc" }, HeaderMatchMode.ExactHeader, isCaseSensitive: true) }) }; @@ -161,10 +161,10 @@ public async Task ApplyAsync_MatchingScenarios_AnyHeaderValue(string incomingHea var context = new DefaultHttpContext(); if (incomingHeaderValue is not null) { - context.Request.Headers.Add("org-id", incomingHeaderValue); + context.Request.Headers["org-id"] = incomingHeaderValue; } - var endpoint = CreateEndpoint("org-id", new string[0], mode); + var endpoint = CreateEndpoint("org-id", Array.Empty(), mode); var candidates = new CandidateSet(new[] { endpoint }, new RouteValueDictionary[1], new int[1]); var sut = new HeaderMatcherPolicy(); @@ -304,7 +304,7 @@ public async Task ApplyAsync_MatchingScenarios_OneHeaderValue( var context = new DefaultHttpContext(); if (incomingHeaderValues is not null) { - context.Request.Headers.Add("org-id", incomingHeaderValues.Split(';')); + context.Request.Headers["org-id"] = incomingHeaderValues.Split(';'); } var endpoint = CreateEndpoint("org-id", new[] { headerValue }, headerValueMatchMode, isCaseSensitive); @@ -448,7 +448,7 @@ public async Task ApplyAsync_MatchingScenarios_TwoHeaderValues( var context = new DefaultHttpContext(); if (incomingHeaderValues is not null) { - context.Request.Headers.Add("org-id", incomingHeaderValues.Split(';')); + context.Request.Headers["org-id"] = incomingHeaderValues.Split(';'); } var endpoint = CreateEndpoint("org-id", new[] { header1Value, header2Value }, headerValueMatchMode, isCaseSensitive); @@ -484,7 +484,7 @@ public async Task ApplyAsync_Cookie_UsesDifferentSeparator( bool shouldMatch) { var context = new DefaultHttpContext(); - context.Request.Headers.Add(headerName, incomingHeaderValue); + context.Request.Headers[headerName] = incomingHeaderValue; var endpoint = CreateEndpoint(headerName, new[] { headerValue }, headerValueMatchMode, true); var candidates = new CandidateSet(new[] { endpoint }, new RouteValueDictionary[1], new int[1]); @@ -511,11 +511,11 @@ public async Task ApplyAsync_MultipleRules_RequiresAllHeaders(bool sendHeader1, var context = new DefaultHttpContext(); if (sendHeader1) { - context.Request.Headers.Add("header1", "value1"); + context.Request.Headers["header1"] = "value1"; } if (sendHeader2) { - context.Request.Headers.Add("header2", "value2"); + context.Request.Headers["header2"] = "value2"; } var candidates = new CandidateSet(new[] { endpoint }, new RouteValueDictionary[1], new int[1]); diff --git a/test/ReverseProxy.Tests/Routing/QueryMatcherPolicyTests.cs b/test/ReverseProxy.Tests/Routing/QueryMatcherPolicyTests.cs index 4cb3b1187..1a2fa337a 100644 --- a/test/ReverseProxy.Tests/Routing/QueryMatcherPolicyTests.cs +++ b/test/ReverseProxy.Tests/Routing/QueryMatcherPolicyTests.cs @@ -37,10 +37,10 @@ public void Comparer_SortOrder_SingleRuleEqual() (0, CreateEndpoint("queryparam", new[] { "abc", "def" }, QueryParameterMatchMode.Prefix)), (0, CreateEndpoint("queryparam2", new[] { "abc", "def" }, QueryParameterMatchMode.Prefix)), - (0, CreateEndpoint("queryparam", new string[0], QueryParameterMatchMode.Exists, isCaseSensitive: true)), - (0, CreateEndpoint("queryparam", new string[0], QueryParameterMatchMode.Exists)), - (0, CreateEndpoint("queryparam", new string[0], QueryParameterMatchMode.Exists, isCaseSensitive: true)), - (0, CreateEndpoint("queryparam", new string[0], QueryParameterMatchMode.Exists)), + (0, CreateEndpoint("queryparam", Array.Empty(), QueryParameterMatchMode.Exists, isCaseSensitive: true)), + (0, CreateEndpoint("queryparam", Array.Empty(), QueryParameterMatchMode.Exists)), + (0, CreateEndpoint("queryparam", Array.Empty(), QueryParameterMatchMode.Exists, isCaseSensitive: true)), + (0, CreateEndpoint("queryparam", Array.Empty(), QueryParameterMatchMode.Exists)), }; var sut = new QueryParameterMatcherPolicy(); @@ -71,7 +71,7 @@ public void Comparer_MultipleQueryParameters_SortOrder() { (0, CreateEndpoint(new[] { - new QueryParameterMatcher("queryparam", new string[0], QueryParameterMatchMode.Exists, isCaseSensitive: true), + new QueryParameterMatcher("queryparam", Array.Empty(), QueryParameterMatchMode.Exists, isCaseSensitive: true), new QueryParameterMatcher("queryparam", new[] { "abc" }, QueryParameterMatchMode.Prefix, isCaseSensitive: true), new QueryParameterMatcher("queryparam", new[] { "abc" }, QueryParameterMatchMode.Contains, isCaseSensitive: true), new QueryParameterMatcher("queryparam", new[] { "abc" }, QueryParameterMatchMode.Exact, isCaseSensitive: true) @@ -85,7 +85,7 @@ public void Comparer_MultipleQueryParameters_SortOrder() })), (1, CreateEndpoint(new[] { - new QueryParameterMatcher("queryparam", new string[0], QueryParameterMatchMode.Exists, isCaseSensitive: true), + new QueryParameterMatcher("queryparam", Array.Empty(), QueryParameterMatchMode.Exists, isCaseSensitive: true), new QueryParameterMatcher("queryparam", new[] { "abc" }, QueryParameterMatchMode.Exact, isCaseSensitive: true) })), @@ -120,15 +120,15 @@ public void AppliesToEndpoints_AppliesScenarios() { var scenarios = new[] { - CreateEndpoint("org-id", new string[0], QueryParameterMatchMode.Exists), + CreateEndpoint("org-id", Array.Empty(), QueryParameterMatchMode.Exists), CreateEndpoint("org-id", new[] { "abc" }), CreateEndpoint("org-id", new[] { "abc", "def" }), - CreateEndpoint("org-id", new string[0], QueryParameterMatchMode.Exists, isDynamic: true), + CreateEndpoint("org-id", Array.Empty(), QueryParameterMatchMode.Exists, isDynamic: true), CreateEndpoint("org-id", new[] { "abc" }, isDynamic: true), CreateEndpoint("org-id", null, QueryParameterMatchMode.Exists, isDynamic: true), CreateEndpoint(new[] { - new QueryParameterMatcher("queryParam", new string[0], QueryParameterMatchMode.Exists, isCaseSensitive: true), + new QueryParameterMatcher("queryParam", Array.Empty(), QueryParameterMatchMode.Exists, isCaseSensitive: true), new QueryParameterMatcher("queryParam", new[] { "abc" }, QueryParameterMatchMode.Exact, isCaseSensitive: true) }) }; @@ -167,7 +167,7 @@ public async Task ApplyAsync_MatchingScenarios_AnyQueryParamValue(string incomin context.Request.QueryString = new QueryString(queryStr); } - var endpoint = CreateEndpoint("org-id", new string[0], QueryParameterMatchMode.Exists); + var endpoint = CreateEndpoint("org-id", Array.Empty(), QueryParameterMatchMode.Exists); var candidates = new CandidateSet(new[] { endpoint }, new RouteValueDictionary[1], new int[1]); var sut = new QueryParameterMatcherPolicy(); diff --git a/test/ReverseProxy.Tests/SessionAffinity/BaseSessionAffinityPolicyTests.cs b/test/ReverseProxy.Tests/SessionAffinity/BaseSessionAffinityPolicyTests.cs index 06a89a173..698ec1b6e 100644 --- a/test/ReverseProxy.Tests/SessionAffinity/BaseSessionAffinityPolicyTests.cs +++ b/test/ReverseProxy.Tests/SessionAffinity/BaseSessionAffinityPolicyTests.cs @@ -133,7 +133,7 @@ public static IEnumerable FindAffinitizedDestinationsCases() yield return new object[] { GetHttpContext(new[] { ("SomeKey", "SomeValue") }), destinations, AffinityStatus.AffinityKeyNotSet, null, null, false, null, null }; yield return new object[] { GetHttpContext(new[] { (KeyName, "dest-B") }), destinations, AffinityStatus.OK, destinations[1], Encoding.UTF8.GetBytes("dest-B"), true, null, null }; yield return new object[] { GetHttpContext(new[] { (KeyName, "dest-Z") }), destinations, AffinityStatus.DestinationNotFound, null, Encoding.UTF8.GetBytes("dest-Z"), true, LogLevel.Warning, EventIds.DestinationMatchingToAffinityKeyNotFound }; - yield return new object[] { GetHttpContext(new[] { (KeyName, "dest-B") }), new DestinationState[0], AffinityStatus.DestinationNotFound, null, Encoding.UTF8.GetBytes("dest-B"), true, LogLevel.Warning, EventIds.AffinityCannotBeEstablishedBecauseNoDestinationsFoundOnCluster }; + yield return new object[] { GetHttpContext(new[] { (KeyName, "dest-B") }), Array.Empty(), AffinityStatus.DestinationNotFound, null, Encoding.UTF8.GetBytes("dest-B"), true, LogLevel.Warning, EventIds.AffinityCannotBeEstablishedBecauseNoDestinationsFoundOnCluster }; yield return new object[] { GetHttpContext(new[] { (KeyName, "/////") }, false), destinations, AffinityStatus.AffinityKeyExtractionFailed, null, Encoding.UTF8.GetBytes(InvalidKeyNull), false, LogLevel.Error, EventIds.RequestAffinityKeyDecryptionFailed }; yield return new object[] { GetHttpContext(new[] { (KeyName, InvalidKeyNull) }), destinations, AffinityStatus.AffinityKeyExtractionFailed, null, Encoding.UTF8.GetBytes(InvalidKeyNull), true, LogLevel.Error, EventIds.RequestAffinityKeyDecryptionFailed }; yield return new object[] { GetHttpContext(new[] { (KeyName, InvalidKeyThrow) }), destinations, AffinityStatus.AffinityKeyExtractionFailed, null, Encoding.UTF8.GetBytes(InvalidKeyThrow), true, LogLevel.Error, EventIds.RequestAffinityKeyDecryptionFailed }; diff --git a/test/ReverseProxy.Tests/SessionAffinity/SessionAffinityMiddlewareTests.cs b/test/ReverseProxy.Tests/SessionAffinity/SessionAffinityMiddlewareTests.cs index e07a4e0d3..8a2c27a1e 100644 --- a/test/ReverseProxy.Tests/SessionAffinity/SessionAffinityMiddlewareTests.cs +++ b/test/ReverseProxy.Tests/SessionAffinity/SessionAffinityMiddlewareTests.cs @@ -58,7 +58,7 @@ public async Task Invoke_SuccessfulFlow_CallNext(AffinityStatus status, string f nextInvoked = true; return Task.CompletedTask; }, - policies.Select(p => p.Object), new IAffinityFailurePolicy[0], + policies.Select(p => p.Object), Array.Empty(), new Mock>().Object); var context = new DefaultHttpContext(); context.SetEndpoint(endpoint); diff --git a/test/ReverseProxy.Tests/Transforms/RequestTransformTests.cs b/test/ReverseProxy.Tests/Transforms/RequestTransformTests.cs index bc23760b0..a893f20f9 100644 --- a/test/ReverseProxy.Tests/Transforms/RequestTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/RequestTransformTests.cs @@ -19,7 +19,7 @@ public class RequestTransformTests public void TakeHeader_RemovesAndReturnsProxyRequestHeader(bool copiedHeaders) { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("name", "value0"); + httpContext.Request.Headers["name"] = "value0"; var proxyRequest = new HttpRequestMessage(); proxyRequest.Headers.Add("Name", "value1"); proxyRequest.Content = new StringContent("hello world"); @@ -58,7 +58,7 @@ public void TakeHeaderFromContent_RemovesAndReturnsProxyContentHeader(bool copie public void TakeHeader_HeadersNotCopied_ReturnsHttpRequestHeader() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("name", "value0"); + httpContext.Request.Headers["name"] = "value0"; var proxyRequest = new HttpRequestMessage(); var result = RequestTransform.TakeHeader(new RequestTransformContext() { @@ -73,7 +73,7 @@ public void TakeHeader_HeadersNotCopied_ReturnsHttpRequestHeader() public void TakeHeader_HeadersCopied_ReturnsNothing() { var httpContext = new DefaultHttpContext(); - httpContext.Request.Headers.Add("name", "value0"); + httpContext.Request.Headers["name"] = "value0"; var proxyRequest = new HttpRequestMessage(); var result = RequestTransform.TakeHeader(new RequestTransformContext() { @@ -107,7 +107,7 @@ public void RemoveHeader_RemovesProxyRequestHeader(string names, string removedH foreach (var name in names.Split("; ")) { - httpContext.Request.Headers.Add(name, "value0"); + httpContext.Request.Headers[name] = "value0"; RequestUtilities.AddHeader(proxyRequest, name, "value1"); } diff --git a/test/ReverseProxy.Tests/Transforms/ResponseHeaderRemoveTransformTests.cs b/test/ReverseProxy.Tests/Transforms/ResponseHeaderRemoveTransformTests.cs index 614ececb0..1f0ee97df 100644 --- a/test/ReverseProxy.Tests/Transforms/ResponseHeaderRemoveTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/ResponseHeaderRemoveTransformTests.cs @@ -41,9 +41,9 @@ public async Task RemoveHeader_Success(string names, string values, int status, var httpContext = new DefaultHttpContext(); httpContext.Response.StatusCode = status; var proxyResponse = new HttpResponseMessage(); - foreach (var pair in TestResources.ParseNameAndValues(names, values)) + foreach (var (name, subvalues) in TestResources.ParseNameAndValues(names, values)) { - httpContext.Response.Headers.Add(pair.Name, pair.Values); + httpContext.Response.Headers[name] = subvalues; } var transform = new ResponseHeaderRemoveTransform(removedHeader, condition); diff --git a/test/ReverseProxy.Tests/Transforms/ResponseTrailerRemoveTransformTests.cs b/test/ReverseProxy.Tests/Transforms/ResponseTrailerRemoveTransformTests.cs index 6acd10018..1de013d2d 100644 --- a/test/ReverseProxy.Tests/Transforms/ResponseTrailerRemoveTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/ResponseTrailerRemoveTransformTests.cs @@ -44,9 +44,9 @@ public async Task RemoveTrailerFromFeature_Success(string names, string values, var trailerFeature = new TestTrailersFeature(); httpContext.Features.Set(trailerFeature); var proxyResponse = new HttpResponseMessage(); - foreach (var pair in TestResources.ParseNameAndValues(names, values)) + foreach (var (name, subvalues) in TestResources.ParseNameAndValues(names, values)) { - trailerFeature.Trailers.Add(pair.Name, pair.Values); + trailerFeature.Trailers[name] = subvalues; } var transform = new ResponseTrailerRemoveTransform(removedHeader, condition); diff --git a/test/ReverseProxy.Tests/Transforms/ResponseTrailersTransformTests.cs b/test/ReverseProxy.Tests/Transforms/ResponseTrailersTransformTests.cs index 89e88eb67..ea58d932f 100644 --- a/test/ReverseProxy.Tests/Transforms/ResponseTrailersTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/ResponseTrailersTransformTests.cs @@ -20,7 +20,7 @@ public void TakeHeader_RemovesAndReturnsHttpResponseTrailer(bool copiedHeaders) var httpContext = new DefaultHttpContext(); var trailerFeature = new TestTrailersFeature(); httpContext.Features.Set(trailerFeature); - trailerFeature.Trailers.Add("name", "value0"); + trailerFeature.Trailers["name"] = "value0"; var proxyResponse = new HttpResponseMessage(); proxyResponse.TrailingHeaders.Add("Name", "value1"); var result = ResponseTrailersTransform.TakeHeader(new ResponseTrailersTransformContext() diff --git a/test/ReverseProxy.Tests/Transforms/ResponseTransformTests.cs b/test/ReverseProxy.Tests/Transforms/ResponseTransformTests.cs index eff5d0bcf..010d41657 100644 --- a/test/ReverseProxy.Tests/Transforms/ResponseTransformTests.cs +++ b/test/ReverseProxy.Tests/Transforms/ResponseTransformTests.cs @@ -16,7 +16,7 @@ public class ResponseTransformTests public void TakeHeader_RemovesAndReturnsHttpResponseHeader(bool copiedHeaders) { var httpContext = new DefaultHttpContext(); - httpContext.Response.Headers.Add("name", "value0"); + httpContext.Response.Headers["name"] = "value0"; var proxyResponse = new HttpResponseMessage(); proxyResponse.Headers.Add("Name", "value1"); proxyResponse.Content = new StringContent("hello world"); diff --git a/test/ReverseProxy.Tests/Utilities/CaseInsensitiveEqualHelperTests.cs b/test/ReverseProxy.Tests/Utilities/CaseInsensitiveEqualHelperTests.cs index e516a7a25..3d0b4b255 100644 --- a/test/ReverseProxy.Tests/Utilities/CaseInsensitiveEqualHelperTests.cs +++ b/test/ReverseProxy.Tests/Utilities/CaseInsensitiveEqualHelperTests.cs @@ -20,9 +20,9 @@ public void Equals_Same_Instance_Returns_True() [Fact] public void Equals_Empty_List_Returns_True() { - var list1 = new string[] { }; + var list1 = System.Array.Empty(); - var list2 = new string[] { }; + var list2 = System.Array.Empty(); var equals = CaseInsensitiveEqualHelper.Equals(list1, list2); diff --git a/test/ReverseProxy.Tests/Yarp.ReverseProxy.Tests.csproj b/test/ReverseProxy.Tests/Yarp.ReverseProxy.Tests.csproj index bd32ca132..0df75ab08 100644 --- a/test/ReverseProxy.Tests/Yarp.ReverseProxy.Tests.csproj +++ b/test/ReverseProxy.Tests/Yarp.ReverseProxy.Tests.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Library Yarp.ReverseProxy SYSLIB0039 diff --git a/test/Tests.Common/Yarp.Tests.Common.csproj b/test/Tests.Common/Yarp.Tests.Common.csproj index dacfb0525..d69a03f68 100644 --- a/test/Tests.Common/Yarp.Tests.Common.csproj +++ b/test/Tests.Common/Yarp.Tests.Common.csproj @@ -1,7 +1,7 @@ - net6.0;net7.0 + net6.0;net7.0;net8.0 Library Yarp.Common.Tests