From dea5d83f14604d78b0fae4bbba5447758514fb49 Mon Sep 17 00:00:00 2001
From: pantianying <601666418@qq.com>
Date: Fri, 8 May 2020 21:36:30 +0800
Subject: [PATCH] provider can get attachment in ctx

---
 common/constant/key.go                | 3 +++
 common/proxy/proxy.go                 | 7 ++++++-
 common/proxy/proxy_factory/default.go | 1 +
 3 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/common/constant/key.go b/common/constant/key.go
index d9413fcc9..54ca9d614 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -180,6 +180,9 @@ const (
 	// ForceUseTag is the tag in attachment
 	ForceUseTag = "dubbo.force.tag"
 	Tagkey      = "dubbo.tag"
+
+	// Attachment key in context in invoker
+	AttachmentKey = "attachment"
 )
 
 const (
diff --git a/common/proxy/proxy.go b/common/proxy/proxy.go
index f98a44873..6b6808080 100644
--- a/common/proxy/proxy.go
+++ b/common/proxy/proxy.go
@@ -25,6 +25,7 @@ import (
 
 import (
 	"github.com/apache/dubbo-go/common"
+	"github.com/apache/dubbo-go/common/constant"
 	"github.com/apache/dubbo-go/common/logger"
 	"github.com/apache/dubbo-go/protocol"
 	invocation_impl "github.com/apache/dubbo-go/protocol/invocation"
@@ -140,7 +141,7 @@ func (p *Proxy) Implement(v common.RPCService) {
 			}
 
 			// add user setAttachment
-			atm := invCtx.Value("attachment")
+			atm := invCtx.Value(constant.AttachmentKey)
 			if m, ok := atm.(map[string]string); ok {
 				for k, value := range m {
 					inv.SetAttachments(k, value)
@@ -148,6 +149,10 @@ func (p *Proxy) Implement(v common.RPCService) {
 			}
 
 			result := p.invoke.Invoke(invCtx, inv)
+			logger.Error(result.Attachments())
+			if len(result.Attachments()) > 0 {
+				invCtx = context.WithValue(invCtx, constant.AttachmentKey, result.Attachments())
+			}
 
 			err = result.Error()
 			logger.Debugf("[makeDubboCallProxy] result: %v, err: %v", result.Result(), err)
diff --git a/common/proxy/proxy_factory/default.go b/common/proxy/proxy_factory/default.go
index 114cfee23..013b39911 100644
--- a/common/proxy/proxy_factory/default.go
+++ b/common/proxy/proxy_factory/default.go
@@ -113,6 +113,7 @@ func (pi *ProxyInvoker) Invoke(ctx context.Context, invocation protocol.Invocati
 
 	in := []reflect.Value{svc.Rcvr()}
 	if method.CtxType() != nil {
+		ctx = context.WithValue(ctx, constant.AttachmentKey, invocation.Attachments())
 		in = append(in, method.SuiteContext(ctx))
 	}
 
-- 
GitLab