[v4] breaking change: modify API for working with response metadata (#255)
Some checks failed
coverage / build (push) Failing after 40s
test / test (push) Successful in 3m3s
sync / sync (push) Successful in 17s

* implement functions to append/get metadata

* сhanged behavior to return nil instead of empty metadata for getResponseMetadata()

* removed metadata copy when passing to gRPC headers

---------

Co-authored-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
2025-04-29 20:34:11 +05:00
committed by GitHub
parent 8a85989b79
commit e4ba134fa6
4 changed files with 191 additions and 4 deletions

View File

@@ -263,6 +263,7 @@ func (g *Server) handler(srv interface{}, stream grpc.ServerStream) error {
// create new context
ctx = metadata.NewIncomingContext(ctx, md)
ctx = metadata.NewOutgoingContext(ctx, metadata.New(0))
ctx = context.WithValue(ctx, rspMetadataKey{}, &rspMetadataVal{})
stream = &streamWrapper{ctx, stream}
@@ -397,8 +398,8 @@ func (g *Server) processRequest(ctx context.Context, stream grpc.ServerStream, s
statusDesc := ""
// execute the handler
appErr := fn(ctx, r, replyv.Interface())
if outmd, ok := metadata.FromOutgoingContext(ctx); ok {
if err = stream.SendHeader(gmetadata.MD(outmd.Copy())); err != nil {
if md := getResponseMetadata(ctx); len(md) > 0 {
if err = stream.SendHeader(gmetadata.MD(md)); err != nil {
return err
}
}
@@ -481,8 +482,8 @@ func (g *Server) processStream(ctx context.Context, stream grpc.ServerStream, se
statusDesc := ""
appErr := fn(ctx, r, ss)
if outmd, ok := metadata.FromOutgoingContext(ctx); ok {
if err := stream.SendHeader(gmetadata.MD(outmd.Copy())); err != nil {
if md := getResponseMetadata(ctx); len(md) > 0 {
if err := stream.SendHeader(gmetadata.MD(md)); err != nil {
return err
}
}