From 4de0ec6a3bb7b8a9f8bf5cc936f5baeecb202f0d Mon Sep 17 00:00:00 2001 From: Adphi Date: Sat, 16 Jul 2022 16:43:00 +0200 Subject: [PATCH] add metadata forwarder server interceptors Signed-off-by: Adphi --- interceptors/auth/token.go | 2 +- interceptors/metadata/forward.go | 53 ++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 interceptors/metadata/forward.go diff --git a/interceptors/auth/token.go b/interceptors/auth/token.go index 6c8caf9..485dcfa 100644 --- a/interceptors/auth/token.go +++ b/interceptors/auth/token.go @@ -22,5 +22,5 @@ func makeTokenAuthFunc(v TokenValidator) grpc_auth.AuthFunc { } func NewBearerClientInterceptors(token string) interceptors.ClientInterceptors { - return metadata.NewInterceptors("authorization", "Bearer "+token) + return metadata.NewInterceptors("authorization", "bearer "+token) } diff --git a/interceptors/metadata/forward.go b/interceptors/metadata/forward.go new file mode 100644 index 0000000..dd01c2b --- /dev/null +++ b/interceptors/metadata/forward.go @@ -0,0 +1,53 @@ +package metadata + +import ( + "context" + + "google.golang.org/grpc" + "google.golang.org/grpc/metadata" + + "go.linka.cloud/grpc/interceptors" +) + +func NewForwardInterceptors() interceptors.ServerInterceptors { + return &forward{} +} + +type forward struct{} + +func (f *forward) UnaryServerInterceptor() grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { + if md, ok := metadata.FromIncomingContext(ctx); ok { + ctx = metadata.NewOutgoingContext(ctx, md.Copy()) + } + return handler(ctx, req) + } +} + +func (f *forward) StreamServerInterceptor() grpc.StreamServerInterceptor { + return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + ctx := ss.Context() + md1, ok := metadata.FromIncomingContext(ctx) + if !ok { + return handler(srv, ss) + } + o := md1.Copy() + if md2, ok := metadata.FromOutgoingContext(ctx); ok { + o = metadata.Join(o, md2.Copy()) + } + return handler(srv, NewContextServerStream(metadata.NewOutgoingContext(ctx, o), ss)) + } +} + +func NewContextServerStream(ctx context.Context, ss grpc.ServerStream) grpc.ServerStream { + return &ContextWrapper{ServerStream: ss, ctx: ctx} +} + +type ContextWrapper struct { + grpc.ServerStream + ctx context.Context +} + +func (w *ContextWrapper) Context() context.Context { + return w.ctx +}