Skip to content

Commit

Permalink
added num.go for NBO stuff
Browse files Browse the repository at this point in the history
  • Loading branch information
jbenet committed Sep 2, 2015
1 parent a82a6e0 commit d5bbf59
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 20 deletions.
10 changes: 3 additions & 7 deletions limit.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,7 @@ import (

// LimitedReader wraps an io.Reader with a msgio framed reader. The LimitedReader
// will return a reader which will io.EOF when the msg length is done.
func LimitedReader(r io.Reader) io.Reader {
l := int64(0)
lbuf := make([]byte, lengthSize)
if _, err := io.ReadFull(r, lbuf); err == nil {
l = int64(NBO.Uint32(lbuf))
}
return io.LimitReader(r, l)
func LimitedReader(r io.Reader) (io.Reader, error) {
l, err := ReadLen(r, nil)
return io.LimitReader(r, int64(l)), err
}
17 changes: 4 additions & 13 deletions msgio.go
Original file line number Diff line number Diff line change
@@ -1,17 +1,13 @@
package msgio

import (
"encoding/binary"
"errors"
"io"
"sync"

mpool "github.com/jbenet/go-msgio/mpool"
)

// NBO is NetworkByteOrder
var NBO = binary.BigEndian

// ErrMsgTooLarge is returned when the message length is exessive
var ErrMsgTooLarge = errors.New("message too large")

Expand Down Expand Up @@ -98,9 +94,7 @@ func (s *writer) Write(msg []byte) (int, error) {
func (s *writer) WriteMsg(msg []byte) (err error) {
s.lock.Lock()
defer s.lock.Unlock()

length := uint32(len(msg))
if err := binary.Write(s.W, NBO, &length); err != nil {
if err := WriteLen(s.W, len(msg)); err != nil {
return err
}
_, err = s.W.Write(msg)
Expand Down Expand Up @@ -159,14 +153,11 @@ func (s *reader) NextMsgLen() (int, error) {
return s.nextMsgLen()
}

func (s *reader) nextMsgLen() (int, error) {
func (s *reader) nextMsgLen() (n int, err error) {
if s.next == -1 {
if _, err := io.ReadFull(s.R, s.lbuf); err != nil {
return 0, err
}
s.next = int(NBO.Uint32(s.lbuf))
s.next, err = ReadLen(s.R, s.lbuf)
}
return s.next, nil
return s.next, err
}

func (s *reader) Read(msg []byte) (int, error) {
Expand Down
33 changes: 33 additions & 0 deletions num.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package msgio

import (
"encoding/binary"
"io"
)

// NBO is NetworkByteOrder
var NBO = binary.BigEndian

// WriteLen writes a length to the given writer.
func WriteLen(w io.Writer, l int) error {
ul := uint32(l)
return binary.Write(w, NBO, &ul)
}

// ReadLen reads a length from the given reader.
// if buf is non-nil, it reuses the buffer. Ex:
// l, err := ReadLen(r, nil)
// _, err := ReadLen(r, buf)
func ReadLen(r io.Reader, buf []byte) (int, error) {
if len(buf) < 4 {
buf = make([]byte, 4)
}
buf = buf[:4]

if _, err := io.ReadFull(r, buf); err != nil {
return 0, err
}

n := int(NBO.Uint32(buf))
return n, nil
}

0 comments on commit d5bbf59

Please sign in to comment.