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  }