github.com/anacrolix/torrent@v1.61.0/peer_protocol/metadata.go (about) 1 package peer_protocol 2 3 import ( 4 "github.com/anacrolix/torrent/bencode" 5 ) 6 7 const ( 8 // http://bittorrent.org/beps/bep_0009.html. Note that there's an 9 // LT_metadata, but I've never implemented it. 10 ExtensionNameMetadata = "ut_metadata" 11 ) 12 13 type ( 14 ExtendedMetadataRequestMsg struct { 15 Piece int `bencode:"piece"` 16 TotalSize int `bencode:"total_size"` 17 Type ExtendedMetadataRequestMsgType `bencode:"msg_type"` 18 } 19 20 ExtendedMetadataRequestMsgType int 21 ) 22 23 func MetadataExtensionRequestMsg(peerMetadataExtensionId ExtensionNumber, piece int) Message { 24 return Message{ 25 Type: Extended, 26 ExtendedID: peerMetadataExtensionId, 27 ExtendedPayload: bencode.MustMarshal(ExtendedMetadataRequestMsg{ 28 Piece: piece, 29 Type: RequestMetadataExtensionMsgType, 30 }), 31 } 32 } 33 34 // Returns the expected piece size for this request message. This is needed to determine the offset 35 // into an extension message payload that the request metadata piece data starts. 36 func (me ExtendedMetadataRequestMsg) PieceSize() int { 37 ret := me.TotalSize - me.Piece*(1<<14) 38 if ret > 1<<14 { 39 ret = 1 << 14 40 } 41 return ret 42 }