type Decoder struct {
R *bufio.Reader
- MaxLength Integer
+ MaxLength Integer // TODO: Should this include the length header or not?
}
func (d *Decoder) Decode(msg *Message) (err error) {
return errors.New("message too long")
}
r := bufio.NewReader(io.LimitReader(d.R, int64(length)))
+ defer func() {
+ written, _ := io.Copy(ioutil.Discard, r)
+ if written != 0 && err == nil {
+ err = fmt.Errorf("short read on message type %d, left %d bytes", msg.Type, written)
+ } else if err == io.EOF {
+ err = io.ErrUnexpectedEOF
+ }
+ }()
if length == 0 {
msg.Keepalive = true
return
return
}
msg.Type = MessageType(c)
- defer func() {
- written, _ := io.Copy(ioutil.Discard, r)
- if written != 0 && err != nil {
- err = fmt.Errorf("short read on message type %d, left %d bytes", msg.Type, written)
- }
- }()
switch msg.Type {
case Choke, Unchoke, Interested, NotInterested:
return
default:
err = fmt.Errorf("unknown message type %#v", c)
}
- if err != nil {
- err = fmt.Errorf("decoding type %d: %s", msg.Type, err)
- }
return
}