From 533a0ea43a28568f82d5191ae321b7f43d088b7e Mon Sep 17 00:00:00 2001 From: Adphi Date: Mon, 14 Apr 2025 09:34:15 +0200 Subject: [PATCH] proxy: add RegisterServiceDescs Signed-off-by: Adphi --- proxy/handler.go | 29 +++++++++++++++++++++++++++++ proxy/handler_test.go | 6 ++---- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/proxy/handler.go b/proxy/handler.go index fddc2b8..cc63c03 100644 --- a/proxy/handler.go +++ b/proxy/handler.go @@ -40,6 +40,35 @@ func RegisterService(server grpc.ServiceRegistrar, director StreamDirector, serv server.RegisterService(fakeDesc, streamer) } +func RegisterServiceDescs(server grpc.ServiceRegistrar, director StreamDirector, descs ...grpc.ServiceDesc) { + streamer := &handler{director} + for _, desc := range descs { + fakeDesc := &grpc.ServiceDesc{ + ServiceName: desc.ServiceName, + HandlerType: (*interface{})(nil), + } + for _, desc := range desc.Methods { + streamDesc := grpc.StreamDesc{ + StreamName: desc.MethodName, + Handler: streamer.handler, + ServerStreams: true, + ClientStreams: true, + } + fakeDesc.Streams = append(fakeDesc.Streams, streamDesc) + } + for _, desc := range desc.Streams { + streamDesc := grpc.StreamDesc{ + StreamName: desc.StreamName, + Handler: streamer.handler, + ServerStreams: true, + ClientStreams: true, + } + fakeDesc.Streams = append(fakeDesc.Streams, streamDesc) + } + server.RegisterService(fakeDesc, streamer) + } +} + // TransparentHandler returns a handler that attempts to proxy all requests that are not registered in the server. // The indented use here is as a transparent proxy, where the server doesn't know about the services implemented by the // backends. It should be used as a `grpc.UnknownServiceHandler`. diff --git a/proxy/handler_test.go b/proxy/handler_test.go index aca4e96..a853f9f 100644 --- a/proxy/handler_test.go +++ b/proxy/handler_test.go @@ -216,10 +216,8 @@ func (s *ProxyHappySuite) SetupSuite() { grpc.CustomCodec(proxy.Codec()), grpc.UnknownServiceHandler(proxy.TransparentHandler(director)), ) - // Ping handler is handled as an explicit registration and not as a TransparentHandler. - proxy.RegisterService(s.proxy, director, - "mwitkow.testproto.TestService", - "Ping") + + proxy.RegisterServiceDescs(s.proxy, director, pb.TestService_ServiceDesc) // Start the serving loops. s.T().Logf("starting grpc.Server at: %v", s.serverListener.Addr().String())