From ac3815ba86494e979d37173011081f22f90892ed Mon Sep 17 00:00:00 2001
From: fangyincheng <fangyincheng@sina.com>
Date: Wed, 5 Jun 2019 14:07:04 +0800
Subject: [PATCH] Fix:return error should be Response_OK

---
 examples/dubbo/go-client/app/client.go           |  9 ++++++++-
 examples/dubbo/go-client/app/user.go             |  1 +
 examples/dubbo/go-server/app/user.go             |  4 ++++
 examples/dubbo/go-server/profiles/dev/server.yml |  2 +-
 .../dubbo/go-server/profiles/release/server.yml  |  2 +-
 .../dubbo/go-server/profiles/test/server.yml     |  2 +-
 .../main/java/com/ikurento/user/Consumer.java    |  9 +++++++++
 .../java/com/ikurento/user/UserProvider.java     |  2 ++
 .../java/com/ikurento/user/UserProvider.java     |  2 ++
 .../ikurento/user/UserProviderAnotherImpl.java   |  4 +++-
 .../java/com/ikurento/user/UserProviderImpl.java |  3 +++
 examples/jsonrpc/go-client/app/client.go         |  3 ---
 filter/impl/echo_filter.go                       |  5 +----
 go.mod                                           |  2 +-
 go.sum                                           |  4 ++--
 protocol/dubbo/client_test.go                    |  4 ++--
 protocol/dubbo/listener.go                       | 16 ++++++++--------
 .../protocolwrapper/protocol_filter_wrapper.go   |  2 +-
 registry/directory/directory.go                  |  2 +-
 registry/protocol/protocol.go                    |  5 +----
 registry/zookeeper/listener.go                   |  5 ++++-
 21 files changed, 56 insertions(+), 32 deletions(-)

diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go
index c95654267..89559f0b9 100644
--- a/examples/dubbo/go-client/app/client.go
+++ b/examples/dubbo/go-client/app/client.go
@@ -24,11 +24,11 @@ import (
 )
 
 import (
-	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	"github.com/dubbogo/hessian2"
 )
 
 import (
+	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	_ "github.com/dubbo/go-for-apache-dubbo/common/proxy/proxy_factory"
 	"github.com/dubbo/go-for-apache-dubbo/config"
 	_ "github.com/dubbo/go-for-apache-dubbo/protocol/dubbo"
@@ -99,6 +99,13 @@ func main() {
 		println("response result: %v", user)
 	}
 
+	println("\n\n\nstart to test dubbo - getErr")
+	user = &User{}
+	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetErr(context.TODO(), []interface{}{"A003"}, user)
+	if err != nil {
+		println("getErr - error: %v", err)
+	}
+
 	println("\n\n\nstart to test dubbo illegal method")
 	err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser1(context.TODO(), []interface{}{"A003"}, user)
 	if err != nil {
diff --git a/examples/dubbo/go-client/app/user.go b/examples/dubbo/go-client/app/user.go
index 7e9d3daed..65fc30f17 100644
--- a/examples/dubbo/go-client/app/user.go
+++ b/examples/dubbo/go-client/app/user.go
@@ -94,6 +94,7 @@ func (User) JavaClassName() string {
 
 type UserProvider struct {
 	GetUsers func(req []interface{}) ([]interface{}, error)
+	GetErr   func(ctx context.Context, req []interface{}, rsp *User) error
 	GetUser  func(ctx context.Context, req []interface{}, rsp *User) error
 	GetUser0 func(id string, name string) (User, error)
 	GetUser1 func(ctx context.Context, req []interface{}, rsp *User) error
diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go
index 427125bd1..87a4ccbcd 100644
--- a/examples/dubbo/go-server/app/user.go
+++ b/examples/dubbo/go-server/app/user.go
@@ -142,6 +142,10 @@ func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User
 	return err
 }
 
+func (u *UserProvider) GetErr(ctx context.Context, req []interface{}, rsp *User) error {
+	return perrors.New("exception")
+}
+
 func (u *UserProvider) GetUser0(id string, name string) (User, error) {
 	var err error
 
diff --git a/examples/dubbo/go-server/profiles/dev/server.yml b/examples/dubbo/go-server/profiles/dev/server.yml
index 6477a6638..7e10dc627 100644
--- a/examples/dubbo/go-server/profiles/dev/server.yml
+++ b/examples/dubbo/go-server/profiles/dev/server.yml
@@ -42,7 +42,7 @@ services:
 
 protocols:
 -   name: "dubbo"
-    ip : "127.0.0.1"
+#    ip : "127.0.0.1"
     port : 20000
 #-   name: "jsonrpc"
 #    ip: "127.0.0.1"
diff --git a/examples/dubbo/go-server/profiles/release/server.yml b/examples/dubbo/go-server/profiles/release/server.yml
index 728e8802d..b46c3304f 100644
--- a/examples/dubbo/go-server/profiles/release/server.yml
+++ b/examples/dubbo/go-server/profiles/release/server.yml
@@ -42,7 +42,7 @@ services:
 
 protocols:
 -   name: "dubbo"
-    ip : "127.0.0.1"
+#    ip : "127.0.0.1"
     port : 20000
 #-   name: "jsonrpc"
 #    ip: "127.0.0.1"
diff --git a/examples/dubbo/go-server/profiles/test/server.yml b/examples/dubbo/go-server/profiles/test/server.yml
index 728e8802d..b46c3304f 100644
--- a/examples/dubbo/go-server/profiles/test/server.yml
+++ b/examples/dubbo/go-server/profiles/test/server.yml
@@ -42,7 +42,7 @@ services:
 
 protocols:
 -   name: "dubbo"
-    ip : "127.0.0.1"
+#    ip : "127.0.0.1"
     port : 20000
 #-   name: "jsonrpc"
 #    ip: "127.0.0.1"
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
index b410813c7..0e4a92677 100644
--- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -51,7 +51,16 @@ public class Consumer {
             System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
                      " UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString()
                      + ", age:" + user2.getAge() + ", time:" + user2.getTime().toString());
+
+            User user9 = userProvider.GetUser1("A003");
+        } catch (Exception e) {
+            System.out.println("*************exception***********");
+            e.printStackTrace();
+        }
+        try {
+            userProvider.GetErr("A003");
         } catch (Exception e) {
+            System.out.println("*************exception***********");
             e.printStackTrace();
         }
     }
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
index d5bce8105..036f46332 100644
--- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
+++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
@@ -20,6 +20,8 @@ import java.util.List;
 
 public interface UserProvider {
 	User GetUser(String userId);
+	User GetErr(String userId) throws Exception;
+	User GetUser1(String userId);
 
 	List<User> GetUsers(List<String> userIdList);
 	User GetUser0(String userId, String name);
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
index b75740bbc..bb1d9a9d4 100644
--- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
+++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
@@ -14,6 +14,8 @@ public interface UserProvider {
 
     User GetUser0(String userId, String name);
 
+	User GetErr(String userId) throws Exception;
+
     Map<String, User> GetUserMap(List<String> userIdList);
 
     User getUser(int usercode);
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
index f0d7faf3d..9eaf989a8 100644
--- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
+++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
@@ -35,7 +35,9 @@ public class UserProviderAnotherImpl implements UserProvider {
     public User GetUser0(String userId, String name) {
                 return new User(userId, name, 48);
     }
-
+    public User GetErr(String userId) throws Exception {
+        throw new Exception("exception");
+    }
     public List<User> GetUsers(ArrayList<String> userIdList) {
         Iterator it = userIdList.iterator();
         List<User> userList = new ArrayList<User>();
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
index 1311bd807..f88756510 100644
--- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
+++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
@@ -32,6 +32,9 @@ public class UserProviderImpl implements UserProvider {
     public User GetUser(String userId) {
         return new User(userId, "zhangsan", 18);
     }
+    public User GetErr(String userId) throws Exception {
+        throw new Exception("exception");
+    }
     public User GetUser0(String userId, String name) {
             return new User(userId, name, 18);
     }
diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go
index b71f0efa2..3793468ce 100644
--- a/examples/jsonrpc/go-client/app/client.go
+++ b/examples/jsonrpc/go-client/app/client.go
@@ -25,9 +25,6 @@ import (
 
 import (
 	"github.com/dubbo/go-for-apache-dubbo/common/logger"
-)
-
-import (
 	_ "github.com/dubbo/go-for-apache-dubbo/common/proxy/proxy_factory"
 	"github.com/dubbo/go-for-apache-dubbo/config"
 	_ "github.com/dubbo/go-for-apache-dubbo/protocol/jsonrpc"
diff --git a/filter/impl/echo_filter.go b/filter/impl/echo_filter.go
index 22ac6abee..0eb2e0d0f 100644
--- a/filter/impl/echo_filter.go
+++ b/filter/impl/echo_filter.go
@@ -14,13 +14,10 @@
 
 package impl
 
-import (
-	"github.com/dubbo/go-for-apache-dubbo/common/logger"
-)
-
 import (
 	"github.com/dubbo/go-for-apache-dubbo/common/constant"
 	"github.com/dubbo/go-for-apache-dubbo/common/extension"
+	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	"github.com/dubbo/go-for-apache-dubbo/filter"
 	"github.com/dubbo/go-for-apache-dubbo/protocol"
 )
diff --git a/go.mod b/go.mod
index a45f3840b..ec78eaf90 100644
--- a/go.mod
+++ b/go.mod
@@ -2,7 +2,7 @@ module github.com/dubbo/go-for-apache-dubbo
 
 require (
 	github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53
-	github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41
+	github.com/dubbogo/hessian2 v0.0.0-20190604191323-5290af08fb56
 	github.com/pkg/errors v0.8.1
 	github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec
 	github.com/stretchr/testify v1.3.0
diff --git a/go.sum b/go.sum
index 3da286534..db094a913 100644
--- a/go.sum
+++ b/go.sum
@@ -6,8 +6,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 h1:bniSNoC4xnAbrx4estwc9F0qkWnh6ZDsAS0y9d7mPos=
 github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53/go.mod h1:cRMSuoCmwc5lULFFnYZTxyCfZhObmRTNbS7XRnPNHSo=
-github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41 h1:lNtW7+aN8oBdCoEuny0rOqOkL5duI4Cu3+G8vqibX48=
-github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM=
+github.com/dubbogo/hessian2 v0.0.0-20190604191323-5290af08fb56 h1:5ZhIvx1pqtpRSfUzcc6jkF9pFsx/DcwymDuuaM3jFuw=
+github.com/dubbogo/hessian2 v0.0.0-20190604191323-5290af08fb56/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM=
 github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q=
diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go
index 216d2e10d..fe18e4de4 100644
--- a/protocol/dubbo/client_test.go
+++ b/protocol/dubbo/client_test.go
@@ -16,13 +16,13 @@ package dubbo
 
 import (
 	"context"
-	"github.com/dubbogo/hessian2"
 	"sync"
 	"testing"
 	"time"
 )
 
 import (
+	"github.com/dubbogo/hessian2"
 	perrors "github.com/pkg/errors"
 	"github.com/stretchr/testify/assert"
 )
@@ -81,7 +81,7 @@ func TestClient_Call(t *testing.T) {
 
 	user = &User{}
 	err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{"1", "username"}, user)
-	assert.EqualError(t, err, "java exception:error")
+	assert.EqualError(t, err, "got exception: error")
 
 	user2 := []interface{}{}
 	err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{"1", "username"}, &user2)
diff --git a/protocol/dubbo/listener.go b/protocol/dubbo/listener.go
index fc56050c1..9cb4ee69a 100644
--- a/protocol/dubbo/listener.go
+++ b/protocol/dubbo/listener.go
@@ -212,7 +212,7 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
 			constant.VERSION_KEY:   p.Service.Version,
 		}))
 		if err := result.Error(); err != nil {
-			p.Header.ResponseStatus = hessian.Response_SERVER_ERROR
+			p.Header.ResponseStatus = hessian.Response_OK
 			p.Body = err
 			h.reply(session, p, hessian.PackageResponse)
 			return
@@ -261,15 +261,15 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) {
 
 	defer func() {
 		if e := recover(); e != nil {
-			req.Header.ResponseStatus = hessian.Response_BAD_REQUEST
+			req.Header.ResponseStatus = hessian.Response_SERVER_ERROR
 			if err, ok := e.(error); ok {
 				logger.Errorf("callService panic: %#v", err)
-				req.Body = e.(error)
+				req.Body = perrors.WithStack(err)
 			} else if err, ok := e.(string); ok {
 				logger.Errorf("callService panic: %#v", perrors.New(err))
 				req.Body = perrors.New(err)
 			} else {
-				logger.Errorf("callService panic: %#v", e)
+				logger.Errorf("callService panic: %#v, this is impossible.", e)
 				req.Body = e
 			}
 		}
@@ -278,7 +278,7 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) {
 	svcIf := req.Body.(map[string]interface{})["service"]
 	if svcIf == nil {
 		logger.Errorf("service not found!")
-		req.Header.ResponseStatus = hessian.Response_SERVICE_NOT_FOUND
+		req.Header.ResponseStatus = hessian.Response_BAD_REQUEST
 		req.Body = perrors.New("service not found")
 		return
 	}
@@ -286,7 +286,7 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) {
 	method := svc.Method()[req.Service.Method]
 	if method == nil {
 		logger.Errorf("method not found!")
-		req.Header.ResponseStatus = hessian.Response_SERVICE_NOT_FOUND
+		req.Header.ResponseStatus = hessian.Response_BAD_REQUEST
 		req.Body = perrors.New("method not found")
 		return
 	}
@@ -323,8 +323,8 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) {
 		retErr = returnValues[1].Interface()
 	}
 	if retErr != nil {
-		req.Header.ResponseStatus = hessian.Response_SERVER_ERROR
-		req.Body = retErr.(error)
+		req.Header.ResponseStatus = hessian.Response_OK
+		req.Body = perrors.WithStack(retErr.(error))
 	} else {
 		req.Body = replyv.Interface()
 	}
diff --git a/protocol/protocolwrapper/protocol_filter_wrapper.go b/protocol/protocolwrapper/protocol_filter_wrapper.go
index e7cb227d5..f6583f99e 100644
--- a/protocol/protocolwrapper/protocol_filter_wrapper.go
+++ b/protocol/protocolwrapper/protocol_filter_wrapper.go
@@ -15,7 +15,6 @@
 package protocolwrapper
 
 import (
-	"github.com/dubbo/go-for-apache-dubbo/filter"
 	"strings"
 )
 
@@ -23,6 +22,7 @@ import (
 	"github.com/dubbo/go-for-apache-dubbo/common"
 	"github.com/dubbo/go-for-apache-dubbo/common/constant"
 	"github.com/dubbo/go-for-apache-dubbo/common/extension"
+	"github.com/dubbo/go-for-apache-dubbo/filter"
 	"github.com/dubbo/go-for-apache-dubbo/protocol"
 )
 
diff --git a/registry/directory/directory.go b/registry/directory/directory.go
index 635e2283b..4c6b22db1 100644
--- a/registry/directory/directory.go
+++ b/registry/directory/directory.go
@@ -20,7 +20,6 @@ import (
 )
 
 import (
-	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	perrors "github.com/pkg/errors"
 )
 
@@ -29,6 +28,7 @@ import (
 	"github.com/dubbo/go-for-apache-dubbo/common"
 	"github.com/dubbo/go-for-apache-dubbo/common/constant"
 	"github.com/dubbo/go-for-apache-dubbo/common/extension"
+	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	"github.com/dubbo/go-for-apache-dubbo/protocol"
 	"github.com/dubbo/go-for-apache-dubbo/protocol/protocolwrapper"
 	"github.com/dubbo/go-for-apache-dubbo/registry"
diff --git a/registry/protocol/protocol.go b/registry/protocol/protocol.go
index 0c1789ac6..24763c9d5 100644
--- a/registry/protocol/protocol.go
+++ b/registry/protocol/protocol.go
@@ -18,14 +18,11 @@ import (
 	"sync"
 )
 
-import (
-	"github.com/dubbo/go-for-apache-dubbo/common/logger"
-)
-
 import (
 	"github.com/dubbo/go-for-apache-dubbo/common"
 	"github.com/dubbo/go-for-apache-dubbo/common/constant"
 	"github.com/dubbo/go-for-apache-dubbo/common/extension"
+	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	"github.com/dubbo/go-for-apache-dubbo/protocol"
 	"github.com/dubbo/go-for-apache-dubbo/protocol/protocolwrapper"
 	"github.com/dubbo/go-for-apache-dubbo/registry"
diff --git a/registry/zookeeper/listener.go b/registry/zookeeper/listener.go
index b6446e7fc..13ccd86fa 100644
--- a/registry/zookeeper/listener.go
+++ b/registry/zookeeper/listener.go
@@ -23,11 +23,14 @@ import (
 )
 
 import (
-	"github.com/dubbo/go-for-apache-dubbo/common/logger"
 	perrors "github.com/pkg/errors"
 	"github.com/samuel/go-zookeeper/zk"
 )
 
+import (
+	"github.com/dubbo/go-for-apache-dubbo/common/logger"
+)
+
 import (
 	"github.com/dubbo/go-for-apache-dubbo/common"
 	"github.com/dubbo/go-for-apache-dubbo/registry"
-- 
GitLab