You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by wo...@apache.org on 2020/08/06 07:14:53 UTC

[dubbo-go-hessian2] branch master updated: fix issue 214 (#216)

This is an automated email from the ASF dual-hosted git repository.

wongoo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-go-hessian2.git


The following commit(s) were added to refs/heads/master by this push:
     new 9e91fc9  fix issue 214 (#216)
9e91fc9 is described below

commit 9e91fc9a7de335e427999bd3cd9cd60ef0304169
Author: 望哥 <ge...@163.com>
AuthorDate: Thu Aug 6 15:14:44 2020 +0800

    fix issue 214 (#216)
---
 binary.go      |  8 ++++++++
 decode_test.go | 45 +++++++++++++++++++++++++++++++++++++++++++++
 list.go        |  2 ++
 3 files changed, 55 insertions(+)

diff --git a/binary.go b/binary.go
index 1cdea45..a30af8d 100644
--- a/binary.go
+++ b/binary.go
@@ -26,6 +26,14 @@ import (
 	perrors "github.com/pkg/errors"
 )
 
+// binaryTag check whether the given tag is a binary tag
+func binaryTag(tag byte) bool {
+	return (tag >= BC_BINARY_DIRECT && tag <= INT_DIRECT_MAX) ||
+		(tag >= BC_BINARY_SHORT && tag <= byte(0x37)) ||
+		tag == BC_BINARY_CHUNK ||
+		tag == BC_BINARY
+}
+
 /////////////////////////////////////////
 // Binary, []byte
 /////////////////////////////////////////
diff --git a/decode_test.go b/decode_test.go
index 30468d7..87f4604 100644
--- a/decode_test.go
+++ b/decode_test.go
@@ -24,12 +24,18 @@
 package hessian
 
 import (
+	"fmt"
 	"log"
 	"os"
 	"os/exec"
 	"reflect"
 	"testing"
 )
+
+import (
+	"github.com/stretchr/testify/assert"
+)
+
 import (
 	"github.com/apache/dubbo-go-hessian2/java_exception"
 )
@@ -145,3 +151,42 @@ func TestUserDefindeException(t *testing.T) {
 	}
 	testDecodeFramework(t, "throw_UserDefindException", expect)
 }
+
+type Circular214 struct {
+	Num      int
+	Previous *Circular214
+	Next     *Circular214
+	Bytes    []byte
+}
+
+func (Circular214) JavaClassName() string {
+	return "com.company.Circular"
+}
+
+func (c *Circular214) String() string {
+	return fmt.Sprintf("Addr:%p, Num: %d, Previous: %p, Next: %p, Bytes: %s", c, c.Num, c.Previous, c.Next, c.Bytes)
+}
+
+func TestIssue214(t *testing.T) {
+	c := &Circular214{}
+	c.Num = 1234
+	c.Previous = c
+	c.Next = c
+	c.Bytes = []byte(`{"a":"b"}`)
+	e := NewEncoder()
+	err := e.Encode(c)
+	if err != nil {
+		assert.FailNow(t, fmt.Sprintf("%v", err))
+		return
+	}
+
+	bytes := e.Buffer()
+	decoder := NewDecoder(bytes)
+	decode, err := decoder.Decode()
+	if err != nil {
+		assert.FailNow(t, fmt.Sprintf("%v", err))
+		return
+	}
+	t.Log(decode)
+	assert.True(t, reflect.DeepEqual(c, decode))
+}
diff --git a/list.go b/list.go
index 87aef90..0eed874 100644
--- a/list.go
+++ b/list.go
@@ -284,6 +284,8 @@ func (d *Decoder) decList(flag int32) (interface{}, error) {
 		return d.readTypedList(tag)
 	case untypedListTag(tag):
 		return d.readUntypedList(tag)
+	case binaryTag(tag):
+		return d.decBinary(int32(tag))
 	default:
 		return nil, perrors.Errorf("error list tag: 0x%x", tag)
 	}