Your observation is right that if an interceptor returns a generator
instead of a grpc.Call object, downstream applications will lose access to
initial_metadata, trailing_metadata, etc..

However, in the API reference [1], the streaming interceptors define the
return value as:

    > An object that is both a Call for the RPC and an iterator of response
values. Drawing response values from the returned Call-iterator may raise
RpcError indicating termination of the RPC with non-OK status.

So, returning a generator without wrapping it as grpc.Call is not fully
supported. Given that, this support can be implementWe always welcome
contributors.

[1]
https://grpc.github.io/grpc/python/grpc.html#grpc.StreamStreamClientInterceptor
<https://grpc.github.io/grpc/python/grpc.html#grpc.StreamStreamClientInterceptor>

On Fri, Jun 5, 2020 at 3:16 AM <[email protected]> wrote:

> It doesn't work if an interceptor intercepts the responses.
> Considering there is such an interceptor:
> def wrapper(iterator):
>   for entry in iterator:
>     yield entry
> class MyInterceptor(grpc.StreamStreamClientInterceptor):
>   def intercept_stream_stream(self, continuation, client_call_details,
> request_iterator):
>     return wrapper(continuation(client_call_details, request_iterator))
> Well I know I could delegate a method `initial_metadata` to the original
> iterator, but unfortunately, I've seen many interceptors written in the way
> above, causing that I couldn't retrieve the initial metadata from last
> interceptor.
> Any idea?
>
> 在 2016年4月6日星期三 UTC+8上午9:08:36,Nathaniel Manista写道:
>>
>> On Tue, Apr 5, 2016 at 9:58 AM, Tang Weiyu <[email protected]> wrote:
>>
>>> Definition of rpc:
>>>   rpc telemetrySubscribe(SubscriptionRequest)     returns (stream
>>> OpenConfigData) {}
>>>
>>
>> What's important here is that the RPC is response-streaming: it will
>> return zero, or one, or many more responses.
>>
>> How to get metadata from client side for streaming type of rpc call?
>>>
>>> On Mon, Apr 4, 2016 at 5:15 PM, Tang Weiyu <[email protected]> wrote:
>>>
>>>> Thanks Nathaniel, unfortunately the returned response don't have those
>>>> 2 methods, though I did get the returned response in the form of stream
>>>> Type defined in proto file RCP.
>>>> Anything missing here?
>>>>
>>>> for data,call in stub.Subscribe(sub_req, _TIMEOUT_SECONDS):
>>>>   metadata = data.initial_metadata()
>>>>
>>>
>> Unpacking the iterator returned by your RPC invocation appears to be a
>> mistake here. I suspect that this should be something like:
>>
>> my_response_iterator = stub.Subscribe(sub_req, _TIMEOUT_SECONDS)
>> my_initial_metadata = my_response_iterator.initial_metadata()
>> for my_response in my_response_iterator:
>>   <take some action for each response value>
>> my_terminal_metadata = my_response_iterator.terminal_metadata()
>>
>> Again, the critical part is that the RPC is response-streaming - the code
>> for a response-unary RPC would look very different.
>> -N
>>
> --
> You received this message because you are subscribed to the Google Groups "
> grpc.io" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/grpc-io/e93d5c60-693c-4790-b107-8a851f42df9fo%40googlegroups.com
> <https://groups.google.com/d/msgid/grpc-io/e93d5c60-693c-4790-b107-8a851f42df9fo%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CAMC1%3Djdxs%2BtOQSbRPagMLKQR7drWG4hd8AABiNEtgo9cwCSw8A%40mail.gmail.com.

Reply via email to