From 4b539b1f117ed1e96ca8f7c5d765fbfd0fc61d7a Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Mon, 19 Oct 2015 01:28:36 +1100 Subject: [PATCH] bencode: Don't skip encoding nil pointers and interfaces This caused an annoying bug for complex types where dictionary values went missing. --- bencode/encode.go | 6 ++++-- bencode/encode_test.go | 12 ++++++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/bencode/encode.go b/bencode/encode.go index 0afe277f..de937362 100644 --- a/bencode/encode.go +++ b/bencode/encode.go @@ -179,9 +179,11 @@ func (e *encoder) reflect_value(v reflect.Value) { e.write_string("e") case reflect.Interface, reflect.Ptr: if v.IsNil() { - break + v = reflect.Zero(v.Type().Elem()) + } else { + v = v.Elem() } - e.reflect_value(v.Elem()) + e.reflect_value(v) default: panic(&MarshalTypeError{v.Type()}) } diff --git a/bencode/encode_test.go b/bencode/encode_test.go index a6b2dfd8..b2a7e612 100644 --- a/bencode/encode_test.go +++ b/bencode/encode_test.go @@ -56,6 +56,18 @@ var random_encode_tests = []random_encode_test{ {[]int{}, "le"}, {map[string]int{}, "de"}, {&dummy{1, 2, 3}, "i2ei3ei4e"}, + {struct { + A *string + }{nil}, "d1:A0:e"}, + {struct { + A *string + }{new(string)}, "d1:A0:e"}, + {struct { + A *string `bencode:",omitempty"` + }{nil}, "de"}, + {struct { + A *string `bencode:",omitempty"` + }{new(string)}, "d1:A0:e"}, } func TestRandomEncode(t *testing.T) { -- 2.48.1