Skip to content

Commit 0229054

Browse files
authored
Use frozen collections (#2272)
1 parent bc0c4c5 commit 0229054

15 files changed

+40
-26
lines changed

docs/docfx/articles/header-guidelines.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Headers are a very important part of processing HTTP requests and each have thei
99

1010
## YARP header filtering
1111

12-
YARP automatically removes request and response headers that could impact its ability to forward a request correctly, or that may be used maliciously to bypass features of the proxy. A complete list can be found [here](https://github.com/microsoft/reverse-proxy/blob/main/src/ReverseProxy/Forwarder/RequestUtilities.cs#L70), with some highlights described below.
12+
YARP automatically removes request and response headers that could impact its ability to forward a request correctly, or that may be used maliciously to bypass features of the proxy. A complete list can be found [here](https://github.com/microsoft/reverse-proxy/blob/main/src/ReverseProxy/Forwarder/RequestUtilities.cs#L71), with some highlights described below.
1313

1414
### Connection, KeepAlive, Close
1515

eng/Versions.props

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
</PropertyGroup>
1313
<!--Package versions-->
1414
<PropertyGroup>
15+
<SystemCollectionsImmutableVersion>8.0.0-rc.1.23419.4</SystemCollectionsImmutableVersion>
1516
<MicrosoftBclTimeProviderVersion>8.0.0-rc.1.23419.4</MicrosoftBclTimeProviderVersion>
1617
<MicrosoftDotNetXUnitExtensionsPackageVersion>8.0.0-beta.23463.1</MicrosoftDotNetXUnitExtensionsPackageVersion>
1718
</PropertyGroup>

src/ReverseProxy/Configuration/ConfigValidator.cs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Linq;
78
using System.Net;
@@ -31,11 +32,11 @@ internal sealed class ConfigValidator : IConfigValidator
3132
private readonly IAuthorizationPolicyProvider _authorizationPolicyProvider;
3233
private readonly IYarpRateLimiterPolicyProvider _rateLimiterPolicyProvider;
3334
private readonly ICorsPolicyProvider _corsPolicyProvider;
34-
private readonly IDictionary<string, ILoadBalancingPolicy> _loadBalancingPolicies;
35-
private readonly IDictionary<string, IAffinityFailurePolicy> _affinityFailurePolicies;
36-
private readonly IDictionary<string, IAvailableDestinationsPolicy> _availableDestinationsPolicies;
37-
private readonly IDictionary<string, IActiveHealthCheckPolicy> _activeHealthCheckPolicies;
38-
private readonly IDictionary<string, IPassiveHealthCheckPolicy> _passiveHealthCheckPolicies;
35+
private readonly FrozenDictionary<string, ILoadBalancingPolicy> _loadBalancingPolicies;
36+
private readonly FrozenDictionary<string, IAffinityFailurePolicy> _affinityFailurePolicies;
37+
private readonly FrozenDictionary<string, IAvailableDestinationsPolicy> _availableDestinationsPolicies;
38+
private readonly FrozenDictionary<string, IActiveHealthCheckPolicy> _activeHealthCheckPolicies;
39+
private readonly FrozenDictionary<string, IPassiveHealthCheckPolicy> _passiveHealthCheckPolicies;
3940
private readonly ILogger _logger;
4041

4142

src/ReverseProxy/Forwarder/RequestUtilities.cs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
using System;
55
using System.Buffers;
6+
using System.Collections.Frozen;
67
using System.Collections.Generic;
78
using System.Diagnostics;
89
using System.Linq;
@@ -67,7 +68,7 @@ internal static bool ShouldSkipResponseHeader(string headerName)
6768
return _headersToExclude.Contains(headerName);
6869
}
6970

70-
private static readonly HashSet<string> _headersToExclude = new(18, StringComparer.OrdinalIgnoreCase)
71+
private static readonly FrozenSet<string> _headersToExclude = new HashSet<string>(18, StringComparer.OrdinalIgnoreCase)
7172
{
7273
HeaderNames.Connection,
7374
HeaderNames.TransferEncoding,
@@ -87,11 +88,11 @@ internal static bool ShouldSkipResponseHeader(string headerName)
8788
HeaderNames.TE,
8889
HeaderNames.AltSvc,
8990
HeaderNames.StrictTransportSecurity,
90-
};
91+
}.ToFrozenSet(StringComparer.OrdinalIgnoreCase);
9192

9293
// Headers marked as HttpHeaderType.Content in
9394
// https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Http/src/System/Net/Http/Headers/KnownHeaders.cs
94-
private static readonly HashSet<string> _contentHeaders = new(11, StringComparer.OrdinalIgnoreCase)
95+
private static readonly FrozenSet<string> _contentHeaders = new HashSet<string>(11, StringComparer.OrdinalIgnoreCase)
9596
{
9697
HeaderNames.Allow,
9798
HeaderNames.ContentDisposition,
@@ -104,7 +105,7 @@ internal static bool ShouldSkipResponseHeader(string headerName)
104105
HeaderNames.ContentType,
105106
HeaderNames.Expires,
106107
HeaderNames.LastModified
107-
};
108+
}.ToFrozenSet(StringComparer.OrdinalIgnoreCase);
108109

109110
/// <summary>
110111
/// Appends the given path and query to the destination prefix while avoiding duplicate '/'.

src/ReverseProxy/Health/ActiveHealthCheckMonitor.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Diagnostics;
78
using System.Net.Http;
@@ -17,7 +18,7 @@ namespace Yarp.ReverseProxy.Health;
1718
internal partial class ActiveHealthCheckMonitor : IActiveHealthCheckMonitor, IClusterChangeListener, IDisposable
1819
{
1920
private readonly ActiveHealthCheckMonitorOptions _monitorOptions;
20-
private readonly IDictionary<string, IActiveHealthCheckPolicy> _policies;
21+
private readonly FrozenDictionary<string, IActiveHealthCheckPolicy> _policies;
2122
private readonly IProbingRequestFactory _probingRequestFactory;
2223
private readonly ILogger<ActiveHealthCheckMonitor> _logger;
2324

src/ReverseProxy/Health/ClusterDestinationsUpdater.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Runtime.CompilerServices;
78
using System.Threading;
@@ -13,7 +14,7 @@ namespace Yarp.ReverseProxy.Health;
1314
internal sealed class ClusterDestinationsUpdater : IClusterDestinationsUpdater
1415
{
1516
private readonly ConditionalWeakTable<ClusterState, SemaphoreSlim> _clusterLocks = new ConditionalWeakTable<ClusterState, SemaphoreSlim>();
16-
private readonly IDictionary<string, IAvailableDestinationsPolicy> _destinationPolicies;
17+
private readonly FrozenDictionary<string, IAvailableDestinationsPolicy> _destinationPolicies;
1718

1819
public ClusterDestinationsUpdater(IEnumerable<IAvailableDestinationsPolicy> destinationPolicies)
1920
{

src/ReverseProxy/Health/PassiveHealthCheckMiddleware.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Threading.Tasks;
78
using Microsoft.AspNetCore.Http;
@@ -12,7 +13,7 @@ namespace Yarp.ReverseProxy.Health;
1213
public class PassiveHealthCheckMiddleware
1314
{
1415
private readonly RequestDelegate _next;
15-
private readonly IDictionary<string, IPassiveHealthCheckPolicy> _policies;
16+
private readonly FrozenDictionary<string, IPassiveHealthCheckPolicy> _policies;
1617

1718
public PassiveHealthCheckMiddleware(RequestDelegate next, IEnumerable<IPassiveHealthCheckPolicy> policies)
1819
{

src/ReverseProxy/LoadBalancing/LoadBalancingMiddleware.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Threading.Tasks;
78
using Microsoft.AspNetCore.Http;
@@ -17,7 +18,7 @@ namespace Yarp.ReverseProxy.LoadBalancing;
1718
internal sealed class LoadBalancingMiddleware
1819
{
1920
private readonly ILogger _logger;
20-
private readonly IDictionary<string, ILoadBalancingPolicy> _loadBalancingPolicies;
21+
private readonly FrozenDictionary<string, ILoadBalancingPolicy> _loadBalancingPolicies;
2122
private readonly RequestDelegate _next;
2223

2324
public LoadBalancingMiddleware(

src/ReverseProxy/SessionAffinity/AffinitizeTransformProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using Yarp.ReverseProxy.Transforms.Builder;
78
using Yarp.ReverseProxy.Utilities;
@@ -10,7 +11,7 @@ namespace Yarp.ReverseProxy.SessionAffinity;
1011

1112
internal sealed class AffinitizeTransformProvider : ITransformProvider
1213
{
13-
private readonly IDictionary<string, ISessionAffinityPolicy> _sessionAffinityPolicies;
14+
private readonly FrozenDictionary<string, ISessionAffinityPolicy> _sessionAffinityPolicies;
1415

1516
public AffinitizeTransformProvider(IEnumerable<ISessionAffinityPolicy> sessionAffinityPolicies)
1617
{

src/ReverseProxy/SessionAffinity/SessionAffinityMiddleware.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using System;
5+
using System.Collections.Frozen;
56
using System.Collections.Generic;
67
using System.Threading.Tasks;
78
using Microsoft.AspNetCore.Http;
@@ -18,8 +19,8 @@ namespace Yarp.ReverseProxy.SessionAffinity;
1819
internal sealed class SessionAffinityMiddleware
1920
{
2021
private readonly RequestDelegate _next;
21-
private readonly IDictionary<string, ISessionAffinityPolicy> _sessionAffinityPolicies;
22-
private readonly IDictionary<string, IAffinityFailurePolicy> _affinityFailurePolicies;
22+
private readonly FrozenDictionary<string, ISessionAffinityPolicy> _sessionAffinityPolicies;
23+
private readonly FrozenDictionary<string, IAffinityFailurePolicy> _affinityFailurePolicies;
2324
private readonly ILogger _logger;
2425

2526
public SessionAffinityMiddleware(

0 commit comments

Comments
 (0)