You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
System.ArgumentException: An item with the same key has already been added.
at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
at System.Net.Http.Headers.HttpHeaders.AddHeaderToStore(String name, HeaderStoreItemInfo info)
at System.Net.Http.Headers.HttpHeaders.CreateAndAddHeaderToStore(String name)
at System.Net.Http.Headers.HttpHeaders.GetOrCreateHeaderInfo(String name, Boolean parseRawValues)
at System.Net.Http.Headers.HttpHeaders.SetParsedValue(String name, Object value)
at System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()
at System.Net.Http.HttpClientHandler.PrepareAndStartContentUpload(RequestState state)
💥 What does this PR do?
This exception might be happened in .NET Framework only. On .NET Core it works smoothly.
🔧 Implementation Notes
This is because we send and read HTTP Request Content in parallel. The implementation of network module in .NET Framework doesn't like it.
🔄 Types of changes
Bug fix (backwards compatible)
PR Type
Bug fix
Description
Fix race condition in .NET Framework HTTP logging
Await HTTP response before reading request content
Add conditional compilation for .NET 8+ cancellation token
Prevent concurrent access to HTTP headers dictionary
Diagram Walkthrough
flowchart LR
A["HTTP Request"] --> B["Send Request"]
B --> C["Await Response"]
C --> D["Read Request Content"]
D --> E["Log Request"]
E --> F["Log Response"]
Reading request content after sending the request may consume the stream, potentially causing issues if the HTTP client needs to retry or if the content stream is not rewindable. This could lead to unexpected behavior in certain scenarios.
The sequential execution change means that if the response fails, the request content logging will still occur. Consider whether request logging should be skipped when the response indicates failure to avoid unnecessary processing.
Reading request content after sending the request may fail because the content stream could be consumed or disposed. Request content should be read before sending the HTTP request to ensure it's available for logging.
Why: The suggestion correctly identifies a critical bug where request.Content is read after being sent, which would likely fail as the content stream would already be consumed.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
User description
🔗 Related Issues
Sometimes the exception is raised:
💥 What does this PR do?
This exception might be happened in .NET Framework only. On .NET Core it works smoothly.
🔧 Implementation Notes
This is because we send and read HTTP Request Content in parallel. The implementation of network module in .NET Framework doesn't like it.
🔄 Types of changes
PR Type
Bug fix
Description
Fix race condition in .NET Framework HTTP logging
Await HTTP response before reading request content
Add conditional compilation for .NET 8+ cancellation token
Prevent concurrent access to HTTP headers dictionary
Diagram Walkthrough
File Walkthrough
HttpCommandExecutor.cs
Fix HTTP logging race conditiondotnet/src/webdriver/Remote/HttpCommandExecutor.cs
logging
content