-
Notifications
You must be signed in to change notification settings - Fork 781
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix HttpContext race condition by copying values to reader and writer #2294
Conversation
// Copy HttpContext values. | ||
// This is done to avoid a race condition when reading them from HttpContext later when running in a separate thread. | ||
_bodyReader = _serverCallContext.HttpContext.Request.BodyReader; | ||
// Copy lifetime feature because HttpContext.RequestAborted on .NET 6 doesn't return the real cancellation token. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could you explain both the 6.0 comment as well as this whole PR?
From my understanding; If you're using the cancellation token on a background thread it might be disposed instead of canceled when the HttpContext is reused. And if you access the token property after it's been reset you might be using a token from another request.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Root problem: dotnet/aspnetcore#42040
The fix it to access the cancellation token on the feature directly. HttpContext.RequestAborted
isn't thread-safe but the feature is.
re: .NET 6. I observed that the cancellation token returned by HttpContext.RequestAborted
and cached at the start of the request behaved strangely. It wouldn't immediately be canceled when the request was aborted. The cached HttpContext.RequestAborted
value appeared to be different from the value after the abort happened (but while the request was still in progress, so the value isn't coming from another request). I didn't investigate why I got this odd behavior in .NET 6 since there was a workaround - access the token from the feature - and .NET 7 and .NET 8 behaved how I expected.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Root problem: dotnet/aspnetcore#42040
The fix it to access the cancellation token on the feature directly.HttpContext.RequestAborted
isn't thread-safe but the feature is.
Oh, so gRPC isn't using the token after the middleware returns? That's what my comment was focused on.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
No. This is in the context of one request.
[![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | |---|---|---|---|---|---| | [Google.Protobuf](https://togithub.com/protocolbuffers/protobuf) | `3.25.0` -> `3.25.1` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Google.Protobuf/3.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Google.Protobuf/3.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Google.Protobuf/3.25.0/3.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Google.Protobuf/3.25.0/3.25.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [Grpc.Net.Client](https://togithub.com/grpc/grpc-dotnet) | `2.58.0` -> `2.59.0` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Grpc.Net.Client/2.59.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Grpc.Net.Client/2.59.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Grpc.Net.Client/2.58.0/2.59.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Grpc.Net.Client/2.58.0/2.59.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [Microsoft.NET.Test.Sdk](https://togithub.com/microsoft/vstest) | `17.7.2` -> `17.8.0` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Microsoft.NET.Test.Sdk/17.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Microsoft.NET.Test.Sdk/17.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Microsoft.NET.Test.Sdk/17.7.2/17.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Microsoft.NET.Test.Sdk/17.7.2/17.8.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [NUnit.Analyzers](https://togithub.com/nunit/nunit.analyzers) | `3.9.0` -> `3.10.0` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/NUnit.Analyzers/3.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/NUnit.Analyzers/3.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/NUnit.Analyzers/3.9.0/3.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/NUnit.Analyzers/3.9.0/3.10.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [Testcontainers](https://dotnet.testcontainers.org/) ([source](https://togithub.com/testcontainers/testcontainers-dotnet)) | `3.5.0` -> `3.6.0` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/Testcontainers/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/Testcontainers/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/Testcontainers/3.5.0/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/Testcontainers/3.5.0/3.6.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | | [cake.tool](https://cakebuild.net/) ([source](https://togithub.com/cake-build/cake)) | `3.1.0` -> `3.2.0` | [![age](https://developer.mend.io/api/mc/badges/age/nuget/cake.tool/3.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/nuget/cake.tool/3.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/nuget/cake.tool/3.1.0/3.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/nuget/cake.tool/3.1.0/3.2.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | --- ### Release Notes <details> <summary>protocolbuffers/protobuf (Google.Protobuf)</summary> ### [`v3.25.1`](https://togithub.com/protocolbuffers/protobuf/compare/v3.25.0...v3.25.1) </details> <details> <summary>grpc/grpc-dotnet (Grpc.Net.Client)</summary> ### [`v2.59.0`](https://togithub.com/grpc/grpc-dotnet/releases/tag/v2.59.0) ##### What's Changed - Fix HttpContext race condition by copying values to reader and writer by [@​JamesNK](https://togithub.com/JamesNK) in [https://github.com/grpc/grpc-dotnet/pull/2294](https://togithub.com/grpc/grpc-dotnet/pull/2294) - Bump [@​babel/traverse](https://togithub.com/babel/traverse) from 7.17.3 to 7.23.2 in /examples/Spar/Server/ClientApp by [@​dependabot](https://togithub.com/dependabot) in [https://github.com/grpc/grpc-dotnet/pull/2298](https://togithub.com/grpc/grpc-dotnet/pull/2298) - Update grpc tools to 2.59 by [@​apolcyn](https://togithub.com/apolcyn) in [https://github.com/grpc/grpc-dotnet/pull/2303](https://togithub.com/grpc/grpc-dotnet/pull/2303) **Full Changelog**: grpc/grpc-dotnet@v2.58.0...v2.59.0 </details> <details> <summary>microsoft/vstest (Microsoft.NET.Test.Sdk)</summary> ### [`v17.8.0`](https://togithub.com/microsoft/vstest/releases/tag/v17.8.0) #### What's Changed **Full Changelog**: microsoft/vstest@v17.7.2...v17.8.0 </details> <details> <summary>nunit/nunit.analyzers (NUnit.Analyzers)</summary> ### [`v3.10.0`](https://togithub.com/nunit/nunit.analyzers/releases/tag/3.10.0): NUnit Analyzers 3.10 (and 2.10) [Compare Source](https://togithub.com/nunit/nunit.analyzers/compare/3.9.0...3.10.0) NUnit Analyzers 3.10 (and 2.10) - November 27, 2023 This release adds a couple of improvements to the analyzers: - Check that users don't accidentally specify CallerArgumentExpression parameters - Relax analyzers for added support for IAsyncEnumerable on \*Source attributes These improvements extend the functionality in the beta that added support for NUnit 4 and for migrating to NUnit 4. Especially, the handling of the movement of classic asserts into a new namespace NUnit.Framework.Legacy and of the improved assert result messages - for more information see https://docs.nunit.org/articles/nunit/Towards-NUnit4.html. The analyzers can help updating the classic assert and fix the assert messages. The release contains contributions from the following users (in alphabetical order): - [@​manfred-brands](https://togithub.com/manfred-brands) - [@​mikkelbu](https://togithub.com/mikkelbu) - [@​stevenaw](https://togithub.com/stevenaw) Issues Resolved Features and Enhancements - [#​639](https://togithub.com/nunit/nunit.analyzers/issues/639) Rule to check users don't accidentally specify CallerArgumentExpression parameters - [#​634](https://togithub.com/nunit/nunit.analyzers/issues/634) Relax analyzers for added support for IAsyncEnumerable on \*Source attributes Tooling, Process, and Documentation - [#​648](https://togithub.com/nunit/nunit.analyzers/issues/648) chore: Skip branch builds on PRs - [#​644](https://togithub.com/nunit/nunit.analyzers/issues/644) chore: Update release notes for 3.10 beta - [#​429](https://togithub.com/nunit/nunit.analyzers/issues/429) Drop the VSIX project </details> <details> <summary>testcontainers/testcontainers-dotnet (Testcontainers)</summary> ### [`v3.6.0`](https://togithub.com/testcontainers/testcontainers-dotnet/releases/tag/3.6.0) [Compare Source](https://togithub.com/testcontainers/testcontainers-dotnet/compare/3.5.0...3.6.0) A heartfelt thank you to each contributor. Your contributions, whether through sharing ideas for improvements, identifying issues, submitting pull requests, or writing articles, are immensely appreciated and help me a lot. THANK YOU for your support. ### What's Changed ####⚠️ Breaking Changes The members of the container and image builder, `WithImagePullPolicy` and `WithImageBuildPolicy`, previously received a callback argument of type `ImagesListResponse`. We've now updated these callbacks, and they will receive an argument of type `ImageInspectResponse`. This change was implemented to offer more detailed information regarding the actual cached image. - feat: Use Docker's inspect API to get resource information ([#​1018](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1018)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) #### 🚀 Features - feat: Extend the "wait until file exists" API to distinguish between the test host and container filesystem ([#​1009](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1009)) [@​maaex](https://togithub.com/maaex) - chore: Do not pre-pull cached images ([#​1032](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1032)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - feat: Add Consul module ([#​1028](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1028)) [@​witskeeper](https://togithub.com/witskeeper) - feat: Add Google Cloud Storage API (fake-gcs-server) module ([#​1023](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1023)) [@​KSemenenko](https://togithub.com/KSemenenko) - feat: Add PubSub module ([#​1005](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1005)) [@​dejandjenic](https://togithub.com/dejandjenic) - feat: Share common interface (IDatabaseContainer) for ADO.NET compatible containers ([#​920](https://togithub.com/testcontainers/testcontainers-dotnet/issues/920)) [@​0xced](https://togithub.com/0xced) - feat: Use Docker's inspect API to get resource information ([#​1018](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1018)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - feat: Ignore FROM args when pre-pulling images ([#​1016](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1016)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - feat: Add NATS module ([#​1003](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1003)) [@​niklasfp](https://togithub.com/niklasfp) - feat: Add Firestore module ([#​988](https://togithub.com/testcontainers/testcontainers-dotnet/issues/988)) [@​dejandjenic](https://togithub.com/dejandjenic) #### 🐛 Bug Fixes - fix: Retain the internal Couchbase builder configuration if the user overrides the default configuration ([#​1040](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1040)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - fix: Prevent invalid negative timestamps getting container logs ([#​1038](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1038)) [@​mausch](https://togithub.com/mausch) #### 📖 Documentation - docs: Add Neo4j example ([#​1013](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1013)) [@​khalidabuhakmeh](https://togithub.com/khalidabuhakmeh) - docs: Add MongoDB example ([#​1012](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1012)) [@​khalidabuhakmeh](https://togithub.com/khalidabuhakmeh) - docs: Add Elasticsearch example ([#​1010](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1010)) [@​khalidabuhakmeh](https://togithub.com/khalidabuhakmeh) - docs: Add Microsoft SQL Server example ([#​1008](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1008)) [@​khalidabuhakmeh](https://togithub.com/khalidabuhakmeh) - docs: Add Flyway example ([#​1002](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1002)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) #### 🧹 Housekeeping - refactor: Cache Docker image full and host name ([#​1043](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1043)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - chore: Remove unnecessary internal APIs ([#​1020](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1020)) [@​HofmeisterAn](https://togithub.com/HofmeisterAn) - chore: Update SSH.NET to version 2023.0.0 ([#​1019](https://togithub.com/testcontainers/testcontainers-dotnet/issues/1019)) [@​WojciechNagorski](https://togithub.com/WojciechNagorski) </details> <details> <summary>cake-build/cake (cake.tool)</summary> ### [`v3.2.0`](https://togithub.com/cake-build/cake/blob/HEAD/ReleaseNotes.md#New-in-320-Released-20231110) - 4225 Add DotNetRemovePackage alias for dotnet remove package command. - 4187 Add DotNetAddPackage alias for dotnet add package command. - 4221 Add Azure Pipelines group logging commands. - 4219 Update Microsoft.CodeAnalysis.CSharp.Scripting to 4.7.0. - 4217 Update NuGet.\* to 6.7.0. - 4215 Update Autofac to 7.1.0. - 4157 Upgrading to spectre.console 0.47.0 breaks the cake build. - 4144 DotNetMSBuildSettings is missing NodeReuse. - 3996 Error: Bad IL format with Cake MacOSX (2.3.0 - 3.1.0). </details> --- ### Configuration 📅 **Schedule**: Branch creation - "before 4am on Monday" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/cerbos/cerbos-sdk-net). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNy40Ni4wIiwidXBkYXRlZEluVmVyIjoiMzcuODEuMyIsInRhcmdldEJyYW5jaCI6Im1haW4ifQ==--> --------- Signed-off-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Signed-off-by: Oğuzhan Durgun <[email protected]> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Oğuzhan Durgun <[email protected]>
Potential fix to
HttpContext.RequestAborted
race condition. Fix is to copy fields need from the context when reader and writer are created.