From 7e3e9e1cba38579bd2e278c7ab0415ee9891014c Mon Sep 17 00:00:00 2001 From: Leonard Lyubich Date: Fri, 13 Nov 2020 16:58:08 +0300 Subject: [PATCH] [#168] session: Implement binary/JSON encoders/decoders on XHeader Signed-off-by: Leonard Lyubich --- v2/session/json.go | 20 ++++++++++++++++++++ v2/session/json_test.go | 12 ++++++++++++ v2/session/marshal.go | 11 +++++++++++ v2/session/marshal_test.go | 6 ++---- 4 files changed, 45 insertions(+), 4 deletions(-) diff --git a/v2/session/json.go b/v2/session/json.go index ec24b58..e8306a8 100644 --- a/v2/session/json.go +++ b/v2/session/json.go @@ -84,3 +84,23 @@ func (t *SessionToken) UnmarshalJSON(data []byte) error { return nil } + +func (x *XHeader) MarshalJSON() ([]byte, error) { + return protojson.MarshalOptions{ + EmitUnpopulated: true, + }.Marshal( + XHeaderToGRPCMessage(x), + ) +} + +func (x *XHeader) UnmarshalJSON(data []byte) error { + msg := new(session.XHeader) + + if err := protojson.Unmarshal(data, msg); err != nil { + return err + } + + *x = *XHeaderFromGRPCMessage(msg) + + return nil +} diff --git a/v2/session/json_test.go b/v2/session/json_test.go index eee4878..0a2033b 100644 --- a/v2/session/json_test.go +++ b/v2/session/json_test.go @@ -54,3 +54,15 @@ func TestSessionTokenJSON(t *testing.T) { require.Equal(t, tok, tok2) } + +func TestXHeaderJSON(t *testing.T) { + x := generateXHeader("key", "value") + + data, err := x.MarshalJSON() + require.NoError(t, err) + + x2 := new(session.XHeader) + require.NoError(t, x2.UnmarshalJSON(data)) + + require.Equal(t, x, x2) +} diff --git a/v2/session/marshal.go b/v2/session/marshal.go index 5b21964..cd5b3a9 100644 --- a/v2/session/marshal.go +++ b/v2/session/marshal.go @@ -177,6 +177,17 @@ func (x *XHeader) StableSize() (size int) { return size } +func (x *XHeader) Unmarshal(data []byte) error { + m := new(session.XHeader) + if err := goproto.Unmarshal(data, m); err != nil { + return err + } + + *x = *XHeaderFromGRPCMessage(m) + + return nil +} + func (l *TokenLifetime) StableMarshal(buf []byte) ([]byte, error) { if l == nil { return []byte{}, nil diff --git a/v2/session/marshal_test.go b/v2/session/marshal_test.go index 5d257a5..0043917 100644 --- a/v2/session/marshal_test.go +++ b/v2/session/marshal_test.go @@ -46,16 +46,14 @@ func TestCreateResponseBody_StableMarshal(t *testing.T) { func TestXHeader_StableMarshal(t *testing.T) { xheaderFrom := generateXHeader("X-Header-Key", "X-Header-Value") - transport := new(grpc.XHeader) t.Run("non empty", func(t *testing.T) { wire, err := xheaderFrom.StableMarshal(nil) require.NoError(t, err) - err = goproto.Unmarshal(wire, transport) - require.NoError(t, err) + xheaderTo := new(session.XHeader) + require.NoError(t, xheaderTo.Unmarshal(wire)) - xheaderTo := session.XHeaderFromGRPCMessage(transport) require.Equal(t, xheaderFrom, xheaderTo) }) }