Alanxtl opened a new issue, #3445:
URL: https://github.com/apache/dubbo-go/issues/3445

   ### Problem
   
   Dubbo-go already supports passing request attachments through 
`context.WithValue(ctx, constant.AttachmentKey, ...)`. The 
`dubbo-go-samples/context` sample covers this direction:
   
   ```text
   consumer request attachment -> provider ctx.Value(constant.AttachmentKey) -> 
business response body
   ```
   
   However, this does not cover the opposite direction:
   
   ```text
   provider result attachments -> Triple response trailers -> consumer reads 
response attachments
   ```
   
   For Triple unary calls, provider-side result attachments can be propagated 
as response trailers. The missing piece is that generic invocations do not 
currently expose a consumer-side API for reading those response trailers.
   
   ### Current limitation
   
   `filter/generic.GenericService` currently defines `Invoke` as a function 
field without per-call options:
   
   ```go
   type GenericService struct {
       Invoke func(ctx context.Context, methodName string, types []string, args 
[]hessian.Object) (any, error) `dubbo:"$invoke"`
   }
   ```
   
   The normal Triple generated unary client path can capture response metadata 
with call options, for example:
   
   ```go
   var trailers http.Header
   resp, err := svc.Greet(
       ctx,
       req,
       client.WithResponseTrailer(&trailers),
   )
   ```
   
   But `GenericService.Invoke` has no `opts ...client.CallOption` parameter, so 
callers cannot pass `client.WithResponseTrailer(&trailers)` when making a 
generic invocation.
   
   ### Expected behavior
   
   Generic Triple unary invocations should provide a way to read response 
attachments/trailers on the consumer side.
   
   One possible API shape:
   
   ```go
   var trailers http.Header
   
   result, err := genericService.Invoke(
       ctx,
       "echo",
       []string{"java.lang.String"},
       []hessian.Object{"hello"},
       client.WithResponseTrailer(&trailers),
   )
   ```
   
   `InvokeWithType` should also be able to pass the same call options through:
   
   ```go
   err := genericService.InvokeWithType(
       ctx,
       "getUser",
       []string{"java.lang.String"},
       []hessian.Object{"123"},
       &user,
       client.WithResponseTrailer(&trailers),
   )
   ```
   
   ### Suggested implementation direction
   
   - Add `opts ...client.CallOption` to `GenericService.Invoke` and 
`InvokeWithType`.
   - Teach the proxy reflection path to recognize and strip optional 
`client.CallOption` values from the service method arguments.
   - Preserve those call options when constructing the invocation, using the 
same response metadata attribute path as generated unary clients 
(`ResponseHeaderKey` / `ResponseTrailerKey`).
   - Avoid introducing a second mechanism that reads response trailers back 
from the original `context.Context`; the existing unary client call option path 
should be reused.
   
   ### Why this matters
   
   Without this, the request attachment path is usable, but generic callers 
cannot read provider response attachments from Triple response trailers. 
Documentation should describe the supported direction clearly, and the generic 
API should expose the same response metadata capture capability available to 
generated unary clients.
   


-- 
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