From 6a6742f0a258cc064b82226c73bae98502bfb860 Mon Sep 17 00:00:00 2001 From: ceshihao Date: Mon, 23 Apr 2018 23:10:55 +0800 Subject: [PATCH] fix base64 contains newline characters \r or \n --- misc_tests/jsoniter_array_test.go | 14 +++++++++++++- reflect_native.go | 8 +++++++- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/misc_tests/jsoniter_array_test.go b/misc_tests/jsoniter_array_test.go index ef467d1..56e3e12 100644 --- a/misc_tests/jsoniter_array_test.go +++ b/misc_tests/jsoniter_array_test.go @@ -3,9 +3,10 @@ package misc_tests import ( "bytes" "encoding/json" + "testing" + "github.com/json-iterator/go" "github.com/stretchr/testify/require" - "testing" ) func Test_empty_array(t *testing.T) { @@ -168,6 +169,17 @@ func Test_decode_byte_array_from_base64(t *testing.T) { should.Equal([]byte{1, 2, 3}, data) } +func Test_decode_byte_array_from_base64_with_newlines(t *testing.T) { + should := require.New(t) + data := []byte{} + err := json.Unmarshal([]byte(`"A\rQ\nID"`), &data) + should.Nil(err) + should.Equal([]byte{1, 2, 3}, data) + err = jsoniter.Unmarshal([]byte(`"A\rQ\nID"`), &data) + should.Nil(err) + should.Equal([]byte{1, 2, 3}, data) +} + func Test_decode_byte_array_from_array(t *testing.T) { should := require.New(t) data := []byte{} diff --git a/reflect_native.go b/reflect_native.go index 7f1e246..fac4d9f 100644 --- a/reflect_native.go +++ b/reflect_native.go @@ -1,11 +1,13 @@ package jsoniter import ( + "bytes" "encoding/base64" - "github.com/modern-go/reflect2" "reflect" "strconv" "unsafe" + + "github.com/modern-go/reflect2" ) const ptrSize = 32 << uintptr(^uintptr(0)>>63) @@ -418,6 +420,10 @@ func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { case StringValue: encoding := base64.StdEncoding src := iter.SkipAndReturnBytes() + // New line characters (\r and \n) are ignored. + // Refer to https://golang.org/pkg/encoding/base64/#Encoding.Decode + src = bytes.Replace(src, []byte(`\r`), []byte{}, -1) + src = bytes.Replace(src, []byte(`\n`), []byte{}, -1) src = src[1 : len(src)-1] decodedLen := encoding.DecodedLen(len(src)) dst := make([]byte, decodedLen)