fix ServerServiceDefinition interception

pull/17889/head
Jan Tattermusch 6 years ago
parent c4e59973a2
commit 83a3b3b382
  1. 52
      src/csharp/Grpc.Core/Interceptors/ServerServiceDefinitionExtensions.cs

@ -44,7 +44,10 @@ namespace Grpc.Core.Interceptors
{
GrpcPreconditions.CheckNotNull(serverServiceDefinition, nameof(serverServiceDefinition));
GrpcPreconditions.CheckNotNull(interceptor, nameof(interceptor));
return new ServerServiceDefinition(serverServiceDefinition.GetCallHandlers().ToDictionary(x => x.Key, x => x.Value.Intercept(interceptor)));
var binder = new InterceptingServiceBinder(interceptor);
serverServiceDefinition.BindService(binder);
return binder.GetInterceptedServerServiceDefinition();
}
/// <summary>
@ -75,5 +78,52 @@ namespace Grpc.Core.Interceptors
return serverServiceDefinition;
}
/// <summary>
/// Helper for creating <c>ServerServiceDefinition</c> with intercepted handlers.
/// </summary>
private class InterceptingServiceBinder : ServiceBinderBase
{
readonly ServerServiceDefinition.Builder builder = ServerServiceDefinition.CreateBuilder();
readonly Interceptor interceptor;
public InterceptingServiceBinder(Interceptor interceptor)
{
this.interceptor = GrpcPreconditions.CheckNotNull(interceptor, nameof(interceptor));
}
internal ServerServiceDefinition GetInterceptedServerServiceDefinition()
{
return builder.Build();
}
public override void AddMethod<TRequest, TResponse>(
Method<TRequest, TResponse> method,
UnaryServerMethod<TRequest, TResponse> handler)
{
builder.AddMethod(method, (request, context) => interceptor.UnaryServerHandler(request, context, handler));
}
public override void AddMethod<TRequest, TResponse>(
Method<TRequest, TResponse> method,
ClientStreamingServerMethod<TRequest, TResponse> handler)
{
builder.AddMethod(method, (requestStream, context) => interceptor.ClientStreamingServerHandler(requestStream, context, handler));
}
public override void AddMethod<TRequest, TResponse>(
Method<TRequest, TResponse> method,
ServerStreamingServerMethod<TRequest, TResponse> handler)
{
builder.AddMethod(method, (request, responseStream, context) => interceptor.ServerStreamingServerHandler(request, responseStream, context, handler));
}
public override void AddMethod<TRequest, TResponse>(
Method<TRequest, TResponse> method,
DuplexStreamingServerMethod<TRequest, TResponse> handler)
{
builder.AddMethod(method, (requestStream, responseStream, context) => interceptor.DuplexStreamingServerHandler(requestStream, responseStream, context, handler));
}
}
}
}

Loading…
Cancel
Save