X-Git-Url: http://www.git.cypherpunks.ru/?a=blobdiff_plain;f=r.go;h=0c65fd41d01d5039c2b9a3e36bbf9cb6e6b3f892;hb=db1063cacc062476c517de92da16720aa574ed19;hp=1138480836523d6e8fabbae75cc1b550769bcf87;hpb=a5c555089e9e9ed32342ad08986ab8019169a9de;p=netstring.git diff --git a/r.go b/r.go index 1138480..0c65fd4 100644 --- a/r.go +++ b/r.go @@ -1,6 +1,6 @@ /* netstring -- netstring format serialization library -Copyright (C) 2015-2022 Sergey Matveev +Copyright (C) 2015-2023 Sergey Matveev This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,8 +19,8 @@ package netstring import ( "bufio" - "bytes" "errors" + "fmt" "io" "strconv" ) @@ -44,20 +44,13 @@ func (r *Reader) Next() (uint64, error) { if !r.eof { return 0, errors.New("current chunk is unread") } - p, _ := r.r.Peek(21) - if len(p) == 0 { - return 0, io.EOF - } - idx := bytes.IndexByte(p, ':') - if idx == -1 { - return 0, errors.New("no length separator found") - } - size, err := strconv.ParseUint(string(p[:idx]), 10, 64) + lenRaw, err := r.r.ReadSlice(':') if err != nil { - return 0, err + return 0, fmt.Errorf("netstring header: %w", err) } - if _, err = r.r.Discard(idx + 1); err != nil { - return 0, err + size, err := strconv.ParseUint(string(lenRaw[:len(lenRaw)-1]), 10, 64) + if err != nil { + return 0, fmt.Errorf("netstring header: %w", err) } r.left = size r.eof = false @@ -67,10 +60,10 @@ func (r *Reader) Next() (uint64, error) { func (r *Reader) checkTerminator() error { b, err := r.r.ReadByte() if err != nil { - return err + return fmt.Errorf("netstring terminator: %w", err) } if b != ',' { - return errors.New("no terminator found") + return errors.New("netstring terminator: not found") } return nil }