gRPC Trailers-Only
responses must be a single HEADERS
frame
#3152
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.
Replaces #3148
Motivation
When a blocking gRPC endpoint with streaming response encounters an exception, it attempts to send
Trailers-Only
response (grpc-status is returned in headers rather than trailers). However, the HTTP/2 layer sends two frames instead of one:HEADERS with endStream=false
andDATA with endStream=true
. Official grpc-java implementation doesn't like that, it wants a singleHEADERS
frame withendStream=true
forTrailers-Only
responses.Changes
I added a filter and a context key to signal when we have a case where
Trailers-Only
response is sent. The filter will aggregate the response stream, observe there are no trailers, drop them, and will only return a singleHEADERS
frame withendStream=true
.This behavior can be tested by
ProtocolCompatibilityTest.unimplementedServiceError
, we unskipped tests that were failing before this fix.Results
Before Change:
After Change: