fix(grpc): Fix handling of non-UTF-8 strings in target URI path#2677
Open
arjan-bal wants to merge 6 commits into
Open
fix(grpc): Fix handling of non-UTF-8 strings in target URI path#2677arjan-bal wants to merge 6 commits into
arjan-bal wants to merge 6 commits into
Conversation
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
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
In Rust, standard strings must hold valid UTF-8 data. While there are types to represent non-UTF-8 strings in the standard library, they are currently unstable.
This PR ensures that non-UTF-8 strings are correctly parsed from the target URI path and propagated through the channel.
Key Changes:
ByteStrsemantics: The UTF-8 invariant on theByteStrtype in the gRPC crate has been dropped, allowing it to store arbitrary bytes. I also implemented common traits to support string-like operations and cross-type comparisons. This enables resolverAddresstypes to hold arbitrary byte sequences.Target::path(): This function now percent-decodes the path and returns aByteStrinstead of an&str.Notes on Authority and UTF-8:
The
Authoritystruct and the channel option'soverride_authorityfunction continue to use standard strings, as they map to the HTTP/2:authoritypseudo-header (which must be valid UTF-8).In the default
ResolverBuilder::default_authorityimplementation, the path is now converted to a string usingString::from_utf8_lossy. To prevent potential data loss, resolver implementations can override this trait method to handle invalid UTF-8 sequences as needed.