bencode/encode.go | 8 ++++---- bencode/encode_test.go | 1 + peer_protocol/pex_test.go | 8 ++++++++ diff --git a/bencode/encode.go b/bencode/encode.go index 8542d430ce33b7da28a4352d7b42065d680a6c41..496ca908f94a4b08db01428001605693ddcc7f1e 100644 --- a/bencode/encode.go +++ b/bencode/encode.go @@ -159,13 +159,13 @@ e.reflectValue(v.MapIndex(key)) } e.writeString("e") case reflect.Slice: - if v.IsNil() { - e.writeString("le") - break - } if v.Type().Elem().Kind() == reflect.Uint8 { s := v.Bytes() e.reflectByteSlice(s) + break + } + if v.IsNil() { + e.writeString("le") break } fallthrough diff --git a/bencode/encode_test.go b/bencode/encode_test.go index bdb0d991a698e473465e6258a78b66cc6c120024..7fc3234ad48c4da9c40d138487032efc324cf4b9 100644 --- a/bencode/encode_test.go +++ b/bencode/encode_test.go @@ -53,6 +53,7 @@ {[]byte{1, 2, 3, 4}, "4:\x01\x02\x03\x04"}, {[4]byte{1, 2, 3, 4}, "li1ei2ei3ei4ee"}, {nil, ""}, {[]byte{}, "0:"}, + {[]byte(nil), "0:"}, {"", "0:"}, {[]int{}, "le"}, {map[string]int{}, "de"}, diff --git a/peer_protocol/pex_test.go b/peer_protocol/pex_test.go index 59a17c87f42b5d6620056d48a8880241b3e53e72..19cd66bfd8372115c3b43f9aa1ae28d82bd2e98f 100644 --- a/peer_protocol/pex_test.go +++ b/peer_protocol/pex_test.go @@ -15,3 +15,11 @@ require.EqualValues(t, 2, len(pem.Added)) require.EqualValues(t, 1286, pem.Added[0].Port) require.EqualValues(t, 0x100*0xb+0xc, pem.Added[1].Port) } + +func TestEmptyPexMsg(t *testing.T) { + pm := PexMsg{} + b, err := bencode.Marshal(pm) + t.Logf("%q", b) + require.NoError(t, err) + require.NoError(t, bencode.Unmarshal(b, &pm)) +}