metadata.go 1.1 KB

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