gRPC-haskell icon indicating copy to clipboard operation
gRPC-haskell copied to clipboard

Document why `ServerReaderResponse` takes a `Maybe response`

Open crclark opened this issue 7 years ago • 3 comments

I just came across this and can't remember why it's optional to return a response message to a client streaming RPC.

The gRPC docs don't mention that the server's response message is optional. It seems to me that either both unary and client streaming responses should be optional, or neither should be optional.

Either way, it should be documented.

crclark avatar Apr 30 '17 02:04 crclark

HTTP has a notion of a successful but empty bodied response: the 204 No Content. It wouldn't surprise me if gRPC had a similar response code since it's based on HTTP2. Nothing for an empty bodied but successful response makes a lot of sense to me, though it's a bit funky for the other responses that might expect a non-empty response body.

ixmatus avatar Apr 30 '17 17:04 ixmatus

Gah, I'm pretty sure there was a reason for this -- I thought that perhaps because of a usage pattern we noticed in some of the C++ client-streaming examples. However, when I went and looked I couldn't reconstruct it. I'm not sure it makes sense either, given that the rpc definition for client-streaming endpoints always specifies a response type. And, as @crclark said, I'm not aware of anything that claims a response message is optional.

I think we should try dropping the Maybe and check interop against the C++ versions as a sanity check. I'll assign this to myself for the time being; will try to look at it soon.

intractable avatar May 01 '17 21:05 intractable

Looking at the types again, I agree with @ixmatus that the type seems to be accounting for status codes that don't include a response message, and all of our high level types should have Maybe responses. Specifically, we have status codes like UNAUTHENTICATED, but the type of the high level unary RPCs guarantees a response message, which seems wrong prima facie. I'm thinking the high level types need to be redesigned around the assumption that we can receive status codes without a response.

This is kind of related to https://github.com/awakenetworks/gRPC-haskell/issues/3 (I'm going to add some detail to that issue, too).

crclark avatar May 02 '17 14:05 crclark