Skip to content

Commit ca77aff

Browse files
[main] Update dependencies from dotnet/runtime dotnet/efcore (#42688)
[main] Update dependencies from dotnet/runtime dotnet/efcore - React to QuicListener API changes - React to QuicException API changes and CertificateChainPolicy - Merge remote-tracking branch 'origin/main' into darc-main-ee82d7a2-6a65-435b-bccd-cf1e9d2e20ce - React to rate limiting API changes - Fix HTTP/3 http.sys tests - Update src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs Co-authored-by: Brennan <[email protected]> - React to Quic changes in IIS tests
1 parent 2ec2536 commit ca77aff

34 files changed

+361
-323
lines changed

eng/Version.Details.xml

Lines changed: 138 additions & 138 deletions
Large diffs are not rendered by default.

eng/Versions.props

Lines changed: 69 additions & 69 deletions
Large diffs are not rendered by default.

src/Middleware/ConcurrencyLimiter/src/QueuePolicies/BasePolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public ValueTask<bool> TryEnterAsync()
4747
return ValueTask.FromResult(true);
4848
}
4949

50-
var task = _limiter.WaitAsync();
50+
var task = _limiter.WaitAndAcquireAsync();
5151
if (task.IsCompletedSuccessfully)
5252
{
5353
lease = task.Result;

src/Middleware/RateLimiting/samples/RateLimitingSample/Program.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
// The global limiter will be a concurrency limiter with a max permit count of 10 and a queue depth of 5.
3131
options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(context =>
3232
{
33-
return RateLimitPartition.CreateConcurrencyLimiter<string>("globalLimiter", key => new ConcurrencyLimiterOptions(10, QueueProcessingOrder.NewestFirst, 5));
33+
return RateLimitPartition.GetConcurrencyLimiter<string>("globalLimiter", key => new ConcurrencyLimiterOptions(10, QueueProcessingOrder.NewestFirst, 5));
3434
});
3535
app.UseRateLimiter(options);
3636

src/Middleware/RateLimiting/samples/RateLimitingSample/SampleRateLimiterPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,6 @@ public SampleRateLimiterPolicy(ILogger<SampleRateLimiterPolicy> logger)
2525
// Use a sliding window limiter allowing 1 request every 10 seconds
2626
public RateLimitPartition<string> GetPartition(HttpContext httpContext)
2727
{
28-
return RateLimitPartition.CreateSlidingWindowLimiter<string>(string.Empty, key => new SlidingWindowRateLimiterOptions(1, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(5), 1));
28+
return RateLimitPartition.GetSlidingWindowLimiter<string>(string.Empty, key => new SlidingWindowRateLimiterOptions(1, QueueProcessingOrder.OldestFirst, 1, TimeSpan.FromSeconds(5), 1));
2929
}
3030
}

src/Middleware/RateLimiting/src/RateLimiterOptionsExtensions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public static RateLimiterOptions AddTokenBucketLimiter(this RateLimiterOptions o
2222
var key = new PolicyNameKey() { PolicyName = policyName };
2323
return options.AddPolicy(policyName, context =>
2424
{
25-
return RateLimitPartition.CreateTokenBucketLimiter(key,
25+
return RateLimitPartition.GetTokenBucketLimiter(key,
2626
_ => tokenBucketRateLimiterOptions);
2727
});
2828
}
@@ -39,7 +39,7 @@ public static RateLimiterOptions AddFixedWindowLimiter(this RateLimiterOptions o
3939
var key = new PolicyNameKey() { PolicyName = policyName };
4040
return options.AddPolicy(policyName, context =>
4141
{
42-
return RateLimitPartition.CreateFixedWindowLimiter(key,
42+
return RateLimitPartition.GetFixedWindowLimiter(key,
4343
_ => fixedWindowRateLimiterOptions);
4444
});
4545
}
@@ -56,7 +56,7 @@ public static RateLimiterOptions AddSlidingWindowLimiter(this RateLimiterOptions
5656
var key = new PolicyNameKey() { PolicyName = policyName };
5757
return options.AddPolicy(policyName, context =>
5858
{
59-
return RateLimitPartition.CreateSlidingWindowLimiter(key,
59+
return RateLimitPartition.GetSlidingWindowLimiter(key,
6060
_ => slidingWindowRateLimiterOptions);
6161
});
6262
}
@@ -73,7 +73,7 @@ public static RateLimiterOptions AddConcurrencyLimiter(this RateLimiterOptions o
7373
var key = new PolicyNameKey() { PolicyName = policyName };
7474
return options.AddPolicy(policyName, context =>
7575
{
76-
return RateLimitPartition.CreateConcurrencyLimiter(key,
76+
return RateLimitPartition.GetConcurrencyLimiter(key,
7777
_ => concurrencyLimiterOptions);
7878
});
7979
}
@@ -89,7 +89,7 @@ public static RateLimiterOptions AddNoLimiter(this RateLimiterOptions options, s
8989
var key = new PolicyNameKey() { PolicyName = policyName };
9090
return options.AddPolicy(policyName, context =>
9191
{
92-
return RateLimitPartition.CreateNoLimiter(key);
92+
return RateLimitPartition.GetNoLimiter(key);
9393
});
9494
}
9595
}

src/Middleware/RateLimiting/src/RateLimitingMiddleware.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,13 +142,13 @@ private async ValueTask<LeaseContext> CombinedWaitAsync(HttpContext context, Can
142142
{
143143
if (_globalLimiter is not null)
144144
{
145-
globalLease = await _globalLimiter.WaitAsync(context, cancellationToken: cancellationToken);
145+
globalLease = await _globalLimiter.WaitAndAcquireAsync(context, cancellationToken: cancellationToken);
146146
if (!globalLease.IsAcquired)
147147
{
148148
return new LeaseContext() { GlobalRejected = true, Lease = globalLease };
149149
}
150150
}
151-
endpointLease = await _endpointLimiter.WaitAsync(context, cancellationToken: cancellationToken);
151+
endpointLease = await _endpointLimiter.WaitAndAcquireAsync(context, cancellationToken: cancellationToken);
152152
if (!endpointLease.IsAcquired)
153153
{
154154
globalLease?.Dispose();
@@ -183,7 +183,7 @@ private PartitionedRateLimiter<HttpContext> CreateEndpointLimiter()
183183
throw new InvalidOperationException($"This endpoint requires a rate limiting policy with name {name}, but no such policy exists.");
184184
}
185185
}
186-
return RateLimitPartition.CreateNoLimiter<DefaultKeyType>(_defaultPolicyKey);
186+
return RateLimitPartition.GetNoLimiter<DefaultKeyType>(_defaultPolicyKey);
187187
}, new DefaultKeyTypeEqualityComparer());
188188
}
189189

src/Middleware/RateLimiting/test/RateLimitingMiddlewareTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ public async Task EndpointLimiter_Rejects()
160160
var name = "myEndpoint";
161161
options.Value.AddPolicy<string>(name, (context =>
162162
{
163-
return RateLimitPartition.Create<string>("myLimiter", (key =>
163+
return RateLimitPartition.Get<string>("myLimiter", (key =>
164164
{
165165
return new TestRateLimiter(false);
166166
}));

src/Middleware/RateLimiting/test/RateLimitingOptionsTests.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class RateLimitingOptionsTests
1313
public void AddPolicy_ThrowsOnNullPolicyName()
1414
{
1515
var options = new RateLimiterOptions();
16-
Assert.Throws<ArgumentNullException>(() => options.AddPolicy<string>(null, context => RateLimitPartition.CreateNoLimiter<string>("myKey")));
16+
Assert.Throws<ArgumentNullException>(() => options.AddPolicy<string>(null, context => RateLimitPartition.GetNoLimiter<string>("myKey")));
1717
}
1818

1919
[Fact]
@@ -34,15 +34,15 @@ public void AddPolicy_ThrowsOnNullPolicy()
3434
public void AddPolicy_ThrowsOnDuplicateName()
3535
{
3636
var options = new RateLimiterOptions();
37-
options.AddPolicy<string>("myKey", context => RateLimitPartition.CreateNoLimiter<string>("myKey"));
38-
Assert.Throws<ArgumentException>(() => options.AddPolicy<string>("myKey", context => RateLimitPartition.CreateNoLimiter<string>("yourKey")));
37+
options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("myKey"));
38+
Assert.Throws<ArgumentException>(() => options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("yourKey")));
3939
}
4040

4141
[Fact]
4242
public void AddPolicy_Generic_ThrowsOnDuplicateName()
4343
{
4444
var options = new RateLimiterOptions();
45-
options.AddPolicy<string>("myKey", context => RateLimitPartition.CreateNoLimiter<string>("myKey"));
45+
options.AddPolicy<string>("myKey", context => RateLimitPartition.GetNoLimiter<string>("myKey"));
4646
Assert.Throws<ArgumentException>(() => options.AddPolicy<string, TestRateLimiterPolicy>("myKey"));
4747
}
4848
}

src/Middleware/RateLimiting/test/TestPartitionedRateLimiter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ protected override RateLimitLease AcquireCore(TResource resourceID, int permitCo
5757
return new TestRateLimitLease(true, leases);
5858
}
5959

60-
protected override async ValueTask<RateLimitLease> WaitAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
60+
protected override async ValueTask<RateLimitLease> WaitAndAcquireAsyncCore(TResource resourceID, int permitCount, CancellationToken cancellationToken)
6161
{
6262
if (permitCount != 1)
6363
{
@@ -66,7 +66,7 @@ protected override async ValueTask<RateLimitLease> WaitAsyncCore(TResource resou
6666
var leases = new List<RateLimitLease>();
6767
foreach (var limiter in limiters)
6868
{
69-
leases.Add(await limiter.WaitAsync());
69+
leases.Add(await limiter.WaitAndAcquireAsync());
7070
}
7171
foreach (var lease in leases)
7272
{

src/Middleware/RateLimiting/test/TestRateLimiter.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Threading.RateLimiting;
55

66
namespace Microsoft.AspNetCore.RateLimiting;
7+
78
internal class TestRateLimiter : RateLimiter
89
{
910
private readonly bool _alwaysAccept;
@@ -25,7 +26,7 @@ protected override RateLimitLease AcquireCore(int permitCount)
2526
return new TestRateLimitLease(_alwaysAccept, null);
2627
}
2728

28-
protected override ValueTask<RateLimitLease> WaitAsyncCore(int permitCount, CancellationToken cancellationToken)
29+
protected override ValueTask<RateLimitLease> WaitAndAcquireAsyncCore(int permitCount, CancellationToken cancellationToken)
2930
{
3031
cancellationToken.ThrowIfCancellationRequested();
3132
return new ValueTask<RateLimitLease>(new TestRateLimitLease(_alwaysAccept, null));

src/Middleware/RateLimiting/test/TestRateLimiterPolicy.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public TestRateLimiterPolicy(string key, int statusCode, bool alwaysAccept)
2727

2828
public RateLimitPartition<string> GetPartition(HttpContext httpContext)
2929
{
30-
return RateLimitPartition.Create<string>(_key, (key =>
30+
return RateLimitPartition.Get<string>(_key, (key =>
3131
{
3232
return new TestRateLimiter(_alwaysAccept);
3333
}));

src/Servers/HttpSys/test/FunctionalTests/Http3Tests.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,9 @@ public async Task Http3_ResetBeforeHeaders()
174174
client.DefaultRequestVersion = HttpVersion.Version30;
175175
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
176176
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
177-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
178-
Assert.Equal(0x010b, qex.ErrorCode);
177+
var qex = Assert.IsType<QuicException>(ex.InnerException);
178+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
179+
Assert.Equal(0x010b, qex.ApplicationErrorCode.Value);
179180
}
180181

181182
[ConditionalFact]
@@ -206,8 +207,9 @@ public async Task Http3_ResetAfterHeaders()
206207
headersReceived.SetResult();
207208
response.EnsureSuccessStatusCode();
208209
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
209-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
210-
Assert.Equal(0x010c, qex.ErrorCode);
210+
var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
211+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
212+
Assert.Equal(0x010c, qex.ApplicationErrorCode.Value);
211213
}
212214

213215
[ConditionalFact]
@@ -231,8 +233,9 @@ public async Task Http3_AppExceptionAfterHeaders_InternalError()
231233
headersReceived.SetResult();
232234
response.EnsureSuccessStatusCode();
233235
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
234-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
235-
Assert.Equal(0x0102, qex.ErrorCode); // H3_INTERNAL_ERROR
236+
var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
237+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
238+
Assert.Equal(0x0102, qex.ApplicationErrorCode.Value); // H3_INTERNAL_ERROR
236239
}
237240

238241
[ConditionalFact]
@@ -251,7 +254,8 @@ public async Task Http3_Abort_Cancel()
251254
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
252255

253256
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
254-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
255-
Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
257+
var qex = Assert.IsType<QuicException>(ex.InnerException);
258+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
259+
Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
256260
}
257261
}

src/Servers/HttpSys/test/FunctionalTests/Microsoft.AspNetCore.Server.HttpSys.FunctionalTests.csproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
55
<TestGroupName>HttpSys.FunctionalTests</TestGroupName>
66
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
7+
<!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
8+
<EnablePreviewFeatures>true</EnablePreviewFeatures>
79
</PropertyGroup>
810

911
<ItemGroup>

src/Servers/IIS/IIS/test/IIS.FunctionalTests/Http3Tests.cs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ public async Task Http3_ResetBeforeHeaders()
120120
client.DefaultRequestVersion = HttpVersion.Version30;
121121
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
122122
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
123-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
124-
Assert.Equal(0x010b, qex.ErrorCode);
123+
var qex = Assert.IsType<QuicException>(ex.InnerException);
124+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
125+
Assert.Equal(0x010b, qex.ApplicationErrorCode.Value);
125126
}
126127

127128
[ConditionalFact]
@@ -135,8 +136,9 @@ public async Task Http3_ResetAfterHeaders()
135136
await client.GetAsync(Fixture.Client.BaseAddress.ToString() + "Http3_ResetAfterHeaders_SetResult");
136137
response.EnsureSuccessStatusCode();
137138
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
138-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
139-
Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
139+
var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
140+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
141+
Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
140142
}
141143

142144
[ConditionalFact]
@@ -151,8 +153,9 @@ public async Task Http3_AppExceptionAfterHeaders_InternalError()
151153
await client.GetAsync(Fixture.Client.BaseAddress.ToString() + "Http3_AppExceptionAfterHeaders_InternalError_SetResult");
152154
response.EnsureSuccessStatusCode();
153155
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => response.Content.ReadAsStringAsync());
154-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException?.InnerException?.InnerException);
155-
Assert.Equal(0x0102, qex.ErrorCode); // H3_INTERNAL_ERROR
156+
var qex = Assert.IsType<QuicException>(ex.InnerException?.InnerException?.InnerException);
157+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
158+
Assert.Equal(0x0102, qex.ApplicationErrorCode.Value); // H3_INTERNAL_ERROR
156159
}
157160

158161
[ConditionalFact]
@@ -164,8 +167,9 @@ public async Task Http3_Abort_Cancel()
164167
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionExact;
165168

166169
var ex = await Assert.ThrowsAsync<HttpRequestException>(() => client.GetAsync(address));
167-
var qex = Assert.IsType<QuicStreamAbortedException>(ex.InnerException);
168-
Assert.Equal(0x010c, qex.ErrorCode); // H3_REQUEST_CANCELLED
170+
var qex = Assert.IsType<QuicException>(ex.InnerException);
171+
Assert.Equal(QuicError.StreamAborted, qex.QuicError);
172+
Assert.Equal(0x010c, qex.ApplicationErrorCode.Value); // H3_REQUEST_CANCELLED
169173
}
170174

171175
private HttpClient SetUpClient()

src/Servers/IIS/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<Project Sdk="Microsoft.NET.Sdk">
1+
<Project Sdk="Microsoft.NET.Sdk">
22

33
<PropertyGroup>
44
<TargetFramework>$(DefaultNetCoreTargetFramework)</TargetFramework>
@@ -7,6 +7,8 @@
77
<DisableFastUpToDateCheck>True</DisableFastUpToDateCheck>
88
<SkipTests Condition=" '$(SkipIISTests)' == 'true' ">true</SkipTests>
99
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
10+
<!-- Required for System.Net.Quic which has a preview API in .NET 7 -->
11+
<EnablePreviewFeatures>true</EnablePreviewFeatures>
1012
</PropertyGroup>
1113

1214
<Import Project="../FunctionalTest.props" />

src/Servers/Kestrel/Core/src/Internal/SniOptionsSelector.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ internal static SslServerAuthenticationOptions CloneSslOptions(SslServerAuthenti
194194
ServerCertificate = sslOptions.ServerCertificate,
195195
ServerCertificateContext = sslOptions.ServerCertificateContext,
196196
ServerCertificateSelectionCallback = sslOptions.ServerCertificateSelectionCallback,
197+
CertificateChainPolicy = sslOptions.CertificateChainPolicy,
197198
};
198199

199200
private sealed class SniOptions

src/Servers/Kestrel/Core/test/SniOptionsSelectorTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,8 @@ public void CloneSslOptionsClonesAllProperties()
794794
ServerCertificateContext = SslStreamCertificateContext.Create(_x509Certificate2, additionalCertificates: null, offline: true),
795795
// Defaults to null
796796
ServerCertificateSelectionCallback = (sender, serverName) => null,
797+
// Defaults to null
798+
CertificateChainPolicy = new X509ChainPolicy(),
797799
};
798800

799801
var clonedOptions = SniOptionsSelector.CloneSslOptions(options);
@@ -836,6 +838,9 @@ public void CloneSslOptionsClonesAllProperties()
836838
Assert.Same(options.ServerCertificateSelectionCallback, clonedOptions.ServerCertificateSelectionCallback);
837839
Assert.True(propertyNames.Remove(nameof(options.ServerCertificateSelectionCallback)));
838840

841+
Assert.Same(options.CertificateChainPolicy, clonedOptions.CertificateChainPolicy);
842+
Assert.True(propertyNames.Remove(nameof(options.CertificateChainPolicy)));
843+
839844
// Ensure we've checked every property. When new properties get added, we'll have to update this test along with the CloneSslOptions implementation.
840845
Assert.Empty(propertyNames);
841846
}

0 commit comments

Comments
 (0)