bencode/decode.go | 25 ++++++++++++++----------- bencode/decode_test.go | 6 ++++++ diff --git a/bencode/decode.go b/bencode/decode.go index 136c92820dba00ea2edb03096bd4998456ba3321..f09ad6f3e375a22d020dfbe82e58b306e13a3096 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -168,26 +168,29 @@ What: errors.New("unexpected I/O error: " + err.Error()), }) } + defer d.buf.Reset() switch v.Kind() { case reflect.String: v.SetString(d.buf.String()) + return nil case reflect.Slice: if v.Type().Elem().Kind() != reflect.Uint8 { - panic(&UnmarshalTypeError{ - Value: "string", - Type: v.Type(), - }) + break } v.SetBytes(append([]byte(nil), d.buf.Bytes()...)) - default: - return &UnmarshalTypeError{ - Value: "string", - Type: v.Type(), + return nil + case reflect.Array: + if v.Type().Elem().Kind() != reflect.Uint8 { + break } + reflect.Copy(v, reflect.ValueOf(d.buf.Bytes())) + return nil } - - d.buf.Reset() - return nil + // I believe we return here to support "ignore_unmarshal_type_error". + return &UnmarshalTypeError{ + Value: "string", + Type: v.Type(), + } } // Info for parsing a dict value. diff --git a/bencode/decode_test.go b/bencode/decode_test.go index 7366102d6baff6e9116907d1ce915e2f826fc2bb..133290443f701cea227fa93e217fa6231d69586a 100644 --- a/bencode/decode_test.go +++ b/bencode/decode_test.go @@ -167,3 +167,9 @@ var i int require.EqualValues(t, ErrUnusedTrailingBytes{1}, Unmarshal([]byte("i42ee"), &i)) assert.EqualValues(t, 42, i) } + +func TestUnmarshalByteArray(t *testing.T) { + var ba [2]byte + assert.NoError(t, Unmarshal([]byte("2:hi"), &ba)) + assert.EqualValues(t, "hi", ba[:]) +}