message.go 942 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package rafthttp
  2. import (
  3. "encoding/binary"
  4. "io"
  5. "github.com/coreos/etcd/pkg/pbutil"
  6. "github.com/coreos/etcd/raft/raftpb"
  7. )
  8. // messageEncoder is a encoder that can encode all kinds of messages.
  9. // It MUST be used with a paired messageDecoder.
  10. type messageEncoder struct {
  11. w io.Writer
  12. }
  13. func (enc *messageEncoder) encode(m raftpb.Message) error {
  14. if err := binary.Write(enc.w, binary.BigEndian, uint64(m.Size())); err != nil {
  15. return err
  16. }
  17. _, err := enc.w.Write(pbutil.MustMarshal(&m))
  18. return err
  19. }
  20. // messageDecoder is a decoder that can decode all kinds of messages.
  21. type messageDecoder struct {
  22. r io.Reader
  23. }
  24. func (dec *messageDecoder) decode() (raftpb.Message, error) {
  25. var m raftpb.Message
  26. var l uint64
  27. if err := binary.Read(dec.r, binary.BigEndian, &l); err != nil {
  28. return m, err
  29. }
  30. buf := make([]byte, int(l))
  31. if _, err := io.ReadFull(dec.r, buf); err != nil {
  32. return m, err
  33. }
  34. return m, m.Unmarshal(buf)
  35. }