17 func (i *Integer) Read(r io.Reader) error {
18 return binary.Read(r, binary.BigEndian, i)
22 Protocol = "\x13BitTorrent protocol"
26 Choke MessageType = iota
40 Index, Begin, Length Integer
45 func (msg Message) MarshalBinary() (data []byte, err error) {
46 buf := &bytes.Buffer{}
51 err = buf.WriteByte(byte(msg.Type))
56 case Choke, Unchoke, Interested, NotInterested:
58 err = binary.Write(buf, binary.BigEndian, msg.Index)
60 for _, i := range []Integer{msg.Index, msg.Begin, msg.Length} {
61 err = binary.Write(buf, binary.BigEndian, i)
67 _, err = buf.Write(marshalBitfield(msg.Bitfield))
69 err = errors.New("unknown message type")
80 func (d *Decoder) Decode(msg *Message) (err error) {
82 err = binary.Read(d.R, binary.BigEndian, &length)
86 if length > d.MaxLength {
87 return errors.New("message too long")
94 c, err := d.R.ReadByte()
98 msg.Type = MessageType(c)
100 case Choke, Unchoke, Interested, NotInterested:
103 err = msg.Index.Read(d.R)
104 case Request, Cancel:
105 err = binary.Read(d.R, binary.BigEndian, []*Integer{&msg.Index, &msg.Begin, &msg.Length})
107 b := make([]byte, length-1)
108 _, err = io.ReadFull(d.R, b)
109 msg.Bitfield = unmarshalBitfield(b)
111 err = fmt.Errorf("unknown message type %#v", c)
116 func encodeMessage(type_ MessageType, data interface{}) []byte {
118 w.WriteByte(byte(type_))
119 err := binary.Write(w, binary.BigEndian, data)
128 func (b Bytes) MarshalBinary() ([]byte, error) {
132 func unmarshalBitfield(b []byte) (bf []bool) {
133 for _, c := range b {
134 for i := 7; i >= 0; i-- {
135 bf = append(bf, (c>>uint(i))&1 == 1)
141 func marshalBitfield(bf []bool) (b []byte) {
142 b = make([]byte, (len(bf)+7)/8)
143 for i, have := range bf {
148 c |= 1 << uint(7-i%8)