-
Notifications
You must be signed in to change notification settings - Fork 107
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
Reconcile trailers-only and misc error behavior with grpc-go #690
Conversation
80fba22
to
381995b
Compare
* This largely undoes a recent change to do more validation of trailers-only responses, which would disallow a body or trailers in what appeared to be a trailers-only response. * Instead, a trailers-only response is now defined by the lack of body and trailers, not the presence of a "grpc-status" header. * This also tweaks some other error scenarios. If trailers (or an end-stream message) is completely missing from a response, it's considered an internal error. But if trailers are present, but the "grpc-status" key is missing, it's considered an issue determining the status, which is an unknown error. * Similarly, if a response content-type doesn't appear to be the right protocol (like it may have come from a non-RPC server), the error code is now unknown. But if it looks like the right protocol but uses the wrong sub-format/codec, it's an internal error. * This is also now more strict about the "compressed" flag in a streaming protocol when there was no compression algorithm negotiated. This was previously not considered an error if the message in question was empty (zero bytes).
21dd00f
to
4d6745d
Compare
@@ -2442,97 +2483,6 @@ func TestClientDisconnect(t *testing.T) { | |||
}) | |||
} | |||
|
|||
func TestTrailersOnlyErrors(t *testing.T) { |
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.
These tests were for the old classification and no longer apply.
For example, they'd check that if we classify a response as trailers-only (due to presence of grpc-status key), then the client complains (in the form of an RPC error with "internal" code) if there is a non-empty body or non-empty HTTP trailers.
But since we now define trailers-only to be a request without body or HTTP trailers, they are moot. In these situations (where a response has a grpc-status key in headers and a non-empty body) we now just ignore the grpc-status key in headers (which is also what grpc-go does).
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.
Apart from my suggestions on comments, this looks great. I'm very glad that we've invested in a more thorough conformance testing suite!
Co-authored-by: Akshay Shah <akshayjshah@users.noreply.github.com>
This largely undoes a recent change to do more validation of trailers-only responses (#685), which disallows a body or trailers in what appeared to be a trailers-only response. In that change, a trailers-only response was identified by the presence of a "grpc-status" key in the headers.
In this PR, a trailers-only response is instead defined by the lack of body and trailers (not the presence of a "grpc-status" header). This PR also tweaks some other error scenarios:
internal
error. But if trailers are present, but the "grpc-status" key is missing, it's considered an issue determining the status, which is anunknown
error.unknown
. But if it looks like the right protocol but uses the wrong sub-format/codec, it's aninternal
error.This PR also now makes connect-go more strict about the "compressed" flag in a streaming protocol when there was no compression algorithm negotiated. Previously, this library was lenient and did not consider it an error if the message in question was empty (zero bytes). But to correctly adhere to gRPC semantics, it MUST report this case as an
internal
error (see bullet 6 in the test cases section of the gRPC compression docs).