20 // Sum of bytes used to Decode values.
26 func (d *Decoder) Decode(v interface{}) (err error) {
28 if e := recover(); e != nil {
29 if _, ok := e.(runtime.Error); ok {
36 pv := reflect.ValueOf(v)
37 if pv.Kind() != reflect.Ptr || pv.IsNil() {
38 return &UnmarshalInvalidArgError{reflect.TypeOf(v)}
41 ok, err := d.parseValue(pv.Elem())
46 d.throwSyntaxError(d.Offset-1, errors.New("unexpected 'e'"))
51 func checkForUnexpectedEOF(err error, offset int64) {
55 What: io.ErrUnexpectedEOF,
60 func (d *Decoder) readByte() byte {
61 b, err := d.r.ReadByte()
63 checkForUnexpectedEOF(err, d.Offset)
71 // reads data writing it to 'd.buf' until 'sep' byte is encountered, 'sep' byte
72 // is consumed, but not included into the 'd.buf'
73 func (d *Decoder) readUntil(sep byte) {
83 func checkForIntParseError(err error, offset int64) {
92 func (d *Decoder) throwSyntaxError(offset int64, err error) {
99 // called when 'i' was consumed
100 func (d *Decoder) parseInt(v reflect.Value) {
101 start := d.Offset - 1
103 if d.buf.Len() == 0 {
106 What: errors.New("empty integer value"),
113 case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
114 n, err := strconv.ParseInt(s, 10, 64)
115 checkForIntParseError(err, start)
117 if v.OverflowInt(n) {
118 panic(&UnmarshalTypeError{
119 Value: "integer " + s,
124 case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
125 n, err := strconv.ParseUint(s, 10, 64)
126 checkForIntParseError(err, start)
128 if v.OverflowUint(n) {
129 panic(&UnmarshalTypeError{
130 Value: "integer " + s,
138 panic(&UnmarshalTypeError{
139 Value: "integer " + s,
146 func (d *Decoder) parseString(v reflect.Value) error {
147 start := d.Offset - 1
149 // read the string length first
151 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
152 checkForIntParseError(err, start)
155 n, err := io.CopyN(&d.buf, d.r, length)
158 checkForUnexpectedEOF(err, d.Offset)
161 What: errors.New("unexpected I/O error: " + err.Error()),
167 v.SetString(d.buf.String())
169 if v.Type().Elem().Kind() != reflect.Uint8 {
170 panic(&UnmarshalTypeError{
175 sl := make([]byte, len(d.buf.Bytes()))
176 copy(sl, d.buf.Bytes())
177 v.Set(reflect.ValueOf(sl))
179 return &UnmarshalTypeError{
189 func (d *Decoder) parseDict(v reflect.Value) error {
193 if t.Key().Kind() != reflect.String {
194 panic(&UnmarshalTypeError{
200 v.Set(reflect.MakeMap(t))
204 panic(&UnmarshalTypeError{
210 var mapElem reflect.Value
212 // so, at this point 'd' byte was consumed, let's just read key/value
215 var valuev reflect.Value
216 keyv := reflect.ValueOf(&d.key).Elem()
217 ok, err := d.parseValue(keyv)
219 return fmt.Errorf("error parsing dict key: %s", err)
225 // get valuev as a map value or as a struct field
228 elem_type := v.Type().Elem()
229 if !mapElem.IsValid() {
230 mapElem = reflect.New(elem_type).Elem()
232 mapElem.Set(reflect.Zero(elem_type))
236 var f reflect.StructField
240 for i, n := 0, t.NumField(); i < n; i++ {
242 tag := f.Tag.Get("bencode")
250 tag_name, _ := parseTag(tag)
251 if tag_name == d.key {
261 if strings.EqualFold(f.Name, d.key) {
269 panic(&UnmarshalFieldError{
275 valuev = v.FieldByIndex(f.Index)
278 _, ok := d.parseValueInterface()
280 return fmt.Errorf("error parsing dict value for key %q", d.key)
286 // now we need to actually parse it
287 ok, err = d.parseValue(valuev)
289 return fmt.Errorf("parsing value for key %q: %s", d.key, err)
292 return fmt.Errorf("missing value for key %q", d.key)
294 if v.Kind() == reflect.Map {
295 v.SetMapIndex(keyv, valuev)
300 func (d *Decoder) parseList(v reflect.Value) error {
302 case reflect.Array, reflect.Slice:
304 panic(&UnmarshalTypeError{
312 if v.Kind() == reflect.Slice && i >= v.Len() {
313 v.Set(reflect.Append(v, reflect.Zero(v.Type().Elem())))
317 ok, err := d.parseValue(v.Index(i))
325 _, ok := d.parseValueInterface()
333 if v.Kind() == reflect.Array {
334 z := reflect.Zero(v.Type().Elem())
335 for n := v.Len(); i < n; i++ {
343 if i == 0 && v.Kind() == reflect.Slice {
344 v.Set(reflect.MakeSlice(v.Type(), 0, 0))
349 func (d *Decoder) readOneValue() bool {
350 b, err := d.r.ReadByte()
364 // read until there is nothing to read
365 for d.readOneValue() {
367 // consume 'e' as well
372 d.buf.WriteString("e")
374 if b >= '0' && b <= '9' {
375 start := d.buf.Len() - 1
377 length, err := strconv.ParseInt(d.buf.String()[start:], 10, 64)
378 checkForIntParseError(err, d.Offset-1)
380 d.buf.WriteString(":")
381 n, err := io.CopyN(&d.buf, d.r, length)
384 checkForUnexpectedEOF(err, d.Offset)
387 What: errors.New("unexpected I/O error: " + err.Error()),
393 d.raiseUnknownValueType(b, d.Offset-1)
400 func (d *Decoder) parseUnmarshaler(v reflect.Value) bool {
401 m, ok := v.Interface().(Unmarshaler)
403 // T doesn't work, try *T
404 if v.Kind() != reflect.Ptr && v.CanAddr() {
405 m, ok = v.Addr().Interface().(Unmarshaler)
411 if ok && (v.Kind() != reflect.Ptr || !v.IsNil()) {
412 if d.readOneValue() {
413 err := m.UnmarshalBencode(d.buf.Bytes())
416 panic(&UnmarshalerError{v.Type(), err})
426 // Returns true if there was a value and it's now stored in 'v', otherwise
427 // there was an end symbol ("e") and no value was stored.
428 func (d *Decoder) parseValue(v reflect.Value) (bool, error) {
429 // we support one level of indirection at the moment
430 if v.Kind() == reflect.Ptr {
431 // if the pointer is nil, allocate a new element of the type it
434 v.Set(reflect.New(v.Type().Elem()))
439 if d.parseUnmarshaler(v) {
443 // common case: interface{}
444 if v.Kind() == reflect.Interface && v.NumMethod() == 0 {
445 iface, _ := d.parseValueInterface()
446 v.Set(reflect.ValueOf(iface))
450 b, err := d.r.ReadByte()
460 return true, d.parseDict(v)
462 return true, d.parseList(v)
467 if b >= '0' && b <= '9' {
469 // append first digit of the length to the buffer
471 return true, d.parseString(v)
474 d.raiseUnknownValueType(b, d.Offset-1)
479 // An unknown bencode type character was encountered.
480 func (d *Decoder) raiseUnknownValueType(b byte, offset int64) {
483 What: fmt.Errorf("unknown value type %+q", b),
487 func (d *Decoder) parseValueInterface() (interface{}, bool) {
488 b, err := d.r.ReadByte()
498 return d.parseDictInterface(), true
500 return d.parseListInterface(), true
502 return d.parseIntInterface(), true
504 if b >= '0' && b <= '9' {
506 // append first digit of the length to the buffer
508 return d.parseStringInterface(), true
511 d.raiseUnknownValueType(b, d.Offset-1)
516 func (d *Decoder) parseIntInterface() (ret interface{}) {
517 start := d.Offset - 1
519 if d.buf.Len() == 0 {
522 What: errors.New("empty integer value"),
526 n, err := strconv.ParseInt(d.buf.String(), 10, 64)
527 if ne, ok := err.(*strconv.NumError); ok && ne.Err == strconv.ErrRange {
529 _, ok := i.SetString(d.buf.String(), 10)
533 What: errors.New("failed to parse integer"),
538 checkForIntParseError(err, start)
546 func (d *Decoder) parseStringInterface() interface{} {
547 start := d.Offset - 1
549 // read the string length first
551 length, err := strconv.ParseInt(d.buf.String(), 10, 64)
552 checkForIntParseError(err, start)
555 n, err := io.CopyN(&d.buf, d.r, length)
558 checkForUnexpectedEOF(err, d.Offset)
561 What: errors.New("unexpected I/O error: " + err.Error()),
570 func (d *Decoder) parseDictInterface() interface{} {
571 dict := make(map[string]interface{})
573 keyi, ok := d.parseValueInterface()
578 key, ok := keyi.(string)
582 What: errors.New("non-string key in a dict"),
586 valuei, ok := d.parseValueInterface()
596 func (d *Decoder) parseListInterface() interface{} {
597 var list []interface{}
599 valuei, ok := d.parseValueInterface()
604 list = append(list, valuei)
607 list = make([]interface{}, 0, 0)