in lib/torrent/scheduler/conn/handshaker.go [97:134]
func handshakeFromP2PMessage(m *p2p.Message) (*handshake, error) {
if m.Type != p2p.Message_BITFIELD {
return nil, fmt.Errorf("expected bitfield message, got %s", m.Type)
}
bitfieldMsg := m.GetBitfield()
if bitfieldMsg == nil {
return nil, fmt.Errorf("empty bit field")
}
peerID, err := core.NewPeerID(bitfieldMsg.PeerID)
if err != nil {
return nil, fmt.Errorf("peer id: %s", err)
}
ih, err := core.NewInfoHashFromHex(bitfieldMsg.InfoHash)
if err != nil {
return nil, fmt.Errorf("info hash: %s", err)
}
d, err := core.NewSHA256DigestFromHex(bitfieldMsg.Name)
if err != nil {
return nil, fmt.Errorf("name: %s", err)
}
bitfield := bitset.New(0)
if err := bitfield.UnmarshalBinary(bitfieldMsg.BitfieldBytes); err != nil {
return nil, err
}
remoteBitfields := make(RemoteBitfields)
if err := remoteBitfields.unmarshalBinary(bitfieldMsg.RemoteBitfieldBytes); err != nil {
return nil, err
}
return &handshake{
peerID: peerID,
infoHash: ih,
bitfield: bitfield,
digest: d,
namespace: bitfieldMsg.Namespace,
remoteBitfields: remoteBitfields,
}, nil
}