- switch s := string(buf[:3]); s {
- case "1:e":
- if _, err = io.ReadFull(r, buf[:2]); err != nil {
- fatal(err.Error())
- }
- if buf[1] != ':' {
- fatal(`bad bencode: invalid "e" format`)
- }
- extLen, err := strconv.Atoi(string(buf[:1]))
- if err != nil {
- fatal(err.Error())
- }
- if _, err = io.ReadFull(r, buf[:extLen]); err != nil {
- fatal(err.Error())
- }
- ext = "." + string(buf[:extLen])
- goto AnotherKey
- case "1:v":
- n, err := r.Read(buf)
- if err != nil {
- fatal(err.Error())
- }
- i := bytes.IndexByte(buf[:n], ':')
- if i == -1 {
- fatal(`bad bencode: invalid "v" length`)
- }
- size, err = strconv.ParseUint(string(buf[:i]), 10, 64)
- if err != nil {
- fatal(err.Error())
- }
- if size == 0 {
- fatal("empty paste")
- }
- if size > *maxSize {
- fatal("too big")
- }
- buf = buf[i+1 : n]
- default:
- fatal("bad bencode: invalid key")