From 95daebd06764741f39db7bbdf5d366162ba188cc Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 13 Jun 2019 13:07:37 +1000 Subject: [PATCH] bencode: Decode singleton lists of the expected type Fixes #297. --- bencode/decode.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/bencode/decode.go b/bencode/decode.go index 081a44a7..8b22fa73 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -344,12 +344,23 @@ func (d *Decoder) parseDict(v reflect.Value) error { func (d *Decoder) parseList(v reflect.Value) error { switch v.Kind() { - case reflect.Array, reflect.Slice: default: - return &UnmarshalTypeError{ - Value: "list", - Type: v.Type(), + // If the list is a singleton of the expected type, use that value. See + // https://github.com/anacrolix/torrent/issues/297. + l := reflect.New(reflect.SliceOf(v.Type())) + if err := d.parseList(l.Elem()); err != nil { + return err + } + if l.Elem().Len() != 1 { + return &UnmarshalTypeError{ + Value: "list", + Type: v.Type(), + } } + v.Set(l.Elem().Index(0)) + return nil + case reflect.Array, reflect.Slice: + // We can work with this. Normal case, fallthrough. } i := 0 -- 2.48.1