Alanxtl commented on issue #2422:
URL: https://github.com/apache/dubbo-go/issues/2422#issuecomment-4750063535

   
   Closing summary:
   
   The Triple header/trailer usage pattern proposed here is now covered by the 
current APIs.
   
   Demo: https://github.com/apache/dubbo-go-samples/pull/1112
   
   ### 1. Client sends request metadata
   
   ```go
   ctx := triple.NewOutgoingContext(context.Background(), http.Header{
        "X-Token": []string{"token-1"},
   })
   ctx = triple.AppendToOutgoingContext(ctx, "X-Mode", "demo")
   
   resp, err := cli.Greet(ctx, &greet.GreetRequest{Name: "dubbo"})
   ```
   
   ### 2. Server reads request metadata
   
   Unary:
   
   ```go
   func (srv *GreetServer) Greet(ctx context.Context, req *greet.GreetRequest) 
(*greet.GreetResponse, error) {
        headers, ok := triple.FromIncomingContext(ctx)
        if ok {
                token := headers.Get("X-Token")
                _ = token
        }
   
        return &greet.GreetResponse{}, nil
   }
   ```
   
   Streaming:
   
   ```go
   func (srv *GreetServer) GreetStream(ctx context.Context, stream 
greet.GreetService_GreetStreamServer) error {
        token := stream.RequestHeader().Get("X-Token")
        _ = token
   
        return nil
   }
   ```
   
   ### 3. Server sends response metadata
   
   Unary:
   
   ```go
   func (srv *GreetServer) Greet(ctx context.Context, req *greet.GreetRequest) 
(*greet.GreetResponse, error) {
        if err := triple.SetHeader(ctx, http.Header{
                "X-Response": []string{"header-value"},
        }); err != nil {
                return nil, err
        }
        if err := triple.SetTrailer(ctx, http.Header{
                "X-Trailer": []string{"trailer-value"},
        }); err != nil {
                return nil, err
        }
   
        return &greet.GreetResponse{}, nil
   }
   ```
   
   Streaming:
   
   ```go
   func (srv *GreetServer) GreetStream(ctx context.Context, stream 
greet.GreetService_GreetStreamServer) error {
        stream.ResponseHeader().Set("X-Response", "header-value")
        stream.ResponseTrailer().Set("X-Trailer", "trailer-value")
   
        return stream.Send(&greet.GreetStreamResponse{})
   }
   ```
   
   ### 4. Client reads unary response metadata
   
   ```go
   var header http.Header
   var trailer http.Header
   
   resp, err := cli.Greet(
        context.Background(),
        &greet.GreetRequest{Name: "dubbo"},
        client.WithResponseHeader(&header),
        client.WithResponseTrailer(&trailer),
   )
   if err != nil {
        return err
   }
   
   responseValue := header.Get("X-Response")
   trailerValue := trailer.Get("X-Trailer")
   _, _ = resp, responseValue
   _ = trailerValue
   ```
   
   ### 5. Client reads streaming response metadata
   
   ```go
   stream, err := cli.GreetStream(context.Background())
   if err != nil {
        return err
   }
   
   if err := stream.Send(&greet.GreetStreamRequest{Name: "dubbo"}); err != nil {
        return err
   }
   
   resp, err := stream.Recv()
   if err != nil {
        return err
   }
   
   headerValue := stream.ResponseHeader().Get("X-Response")
   
   if err := stream.CloseRequest(); err != nil {
        return err
   }
   if err := stream.CloseResponse(); err != nil {
        return err
   }
   
   trailerValue := stream.ResponseTrailer().Get("X-Trailer")
   _, _, _ = resp, headerValue, trailerValue
   ```
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to