bencode/decode.go | 33 ++++++++++++++++----------------- diff --git a/bencode/decode.go b/bencode/decode.go index 9c42578a7ed7387a5783ab07db61a016e96b74cb..0054c8678ea8c067d997a7992ed83539b1cea006 100644 --- a/bencode/decode.go +++ b/bencode/decode.go @@ -611,28 +611,27 @@ d.buf.Reset() return } -func (d *Decoder) parseStringInterface() interface{} { - start := d.Offset - 1 - +func (d *Decoder) parseStringInterface() (s string) { // read the string length first d.readUntil(':') - length, err := strconv.ParseInt(d.buf.String(), 10, 64) - checkForIntParseError(err, start) - + length, err := strconv.ParseInt(bytesAsString(d.buf.Bytes()), 10, 64) + if err != nil { + panic(&SyntaxError{Offset: d.Offset-1, What: err}) + } d.buf.Reset() - n, err := io.CopyN(&d.buf, d.r, length) + n, err := d.buf.ReadFrom(io.LimitReader(d.r, length)) d.Offset += n - if err != nil { - checkForUnexpectedEOF(err, d.Offset) - panic(&SyntaxError{ - Offset: d.Offset, - What: errors.New("unexpected I/O error: " + err.Error()), - }) + switch err { + case nil: + s = d.buf.String() + d.buf.Reset() + return + case io.EOF: + err = io.ErrUnexpectedEOF + default: + err = errors.New("unexpected I/O error: " + err.Error()) } - - s := d.buf.String() - d.buf.Reset() - return s + panic(&SyntaxError{Offset: d.Offset, What: err}) } func (d *Decoder) parseDictInterface() interface{} {