aboutsummaryrefslogtreecommitdiff
path: root/bencode
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2016-06-14 12:45:47 +0200
committerDimitri Sokolyuk <demon@dim13.org>2016-06-14 12:45:47 +0200
commita87bbc6e8637e910fc81cde0f0ee1ab40347ffbd (patch)
tree20bb565ac0b243c267a2e4f861cfdb84cc55f2f9 /bencode
parentbaa16931fd93d3f927975a4d83c02e52a44a3abc (diff)
Dict MUST be sorted
Diffstat (limited to 'bencode')
-rw-r--r--bencode/bencode.go23
1 files changed, 17 insertions, 6 deletions
diff --git a/bencode/bencode.go b/bencode/bencode.go
index 2c2bdfc..244fc66 100644
--- a/bencode/bencode.go
+++ b/bencode/bencode.go
@@ -7,6 +7,7 @@ import (
"fmt"
"io"
"reflect"
+ "sort"
"strconv"
"strings"
"time"
@@ -64,22 +65,32 @@ func marshalDict(out io.Writer, v reflect.Value) {
marshalInt(out, val.Unix())
default:
t := v.Type()
- io.WriteString(out, "d")
+ names := make([]string, t.NumField())
for i := 0; i < t.NumField(); i++ {
- f := t.Field(i)
- tag := f.Tag.Get("bencode")
+ names[i] = t.Field(i).Name
+ }
+ sort.Sort(sort.StringSlice(names))
+
+ io.WriteString(out, "d")
+ for _, n := range names {
+ tf, ok := t.FieldByName(n)
+ if !ok {
+ continue
+ }
+ tag := tf.Tag.Get("bencode")
if tag == "-" {
continue
}
name, param := parseTag(tag)
if name == "" {
- name = f.Name
+ name = n
}
- if param == "optional" && isEmpty(v.Field(i)) {
+ vf := v.FieldByName(n)
+ if param == "optional" && isEmpty(vf) {
continue
}
marshalString(out, name)
- marshalField(out, v.Field(i))
+ marshalField(out, vf)
}
io.WriteString(out, "e")
}