// Client lock must be held before entering this.
func (cl *Client) runHandshookConn(c *PeerConn, t *Torrent) error {
c.setTorrent(t)
+ for i, b := range cl.config.MinPeerExtensions {
+ if c.PeerExtensionBytes[i]&b != b {
+ return fmt.Errorf("peer did not meet minimum peer extensions: %x", c.PeerExtensionBytes)
+ }
+ }
if c.PeerID == cl.peerID {
if c.outgoing {
connsToSelf.Add(1)
"github.com/anacrolix/missinggo/v2"
"github.com/anacrolix/tagflag"
"github.com/anacrolix/torrent/bencode"
+ pp "github.com/anacrolix/torrent/peer_protocol"
"github.com/anacrolix/torrent/version"
"github.com/davecgh/go-spew/spew"
"github.com/dustin/go-humanize"
UtpPeers bool `default:"true"`
Webtorrent bool `default:"true"`
DisableWebseeds bool
+ // Don't progress past handshake for peer connections where the peer doesn't offer the fast
+ // extension.
+ RequireFastExtension bool
Ipv4 bool `default:"true"`
Ipv6 bool `default:"true"`
if flags.Quiet {
clientConfig.Logger = log.Discard
}
+ if flags.RequireFastExtension {
+ clientConfig.MinPeerExtensions.SetBit(pp.ExtensionBitFast, true)
+ }
clientConfig.MaxUnverifiedBytes = flags.MaxUnverifiedBytes.Int64()
var stop missinggo.SynchronizedEvent
DHTOnQuery func(query *krpc.Msg, source net.Addr) (propagate bool)
Extensions PeerExtensionBits
+ // Bits that peers must have set to proceed past handshakes.
+ MinPeerExtensions PeerExtensionBits
DisableWebtorrent bool
DisableWebseeds bool
defer testutil.ExportStatusWriter(seederClient, "s", t)()
leecherClientConfig := torrent.TestingConfig(t)
leecherClientConfig.Debug = true
+ // Don't require fast extension, whether the seeder will provide it or not (so we can test mixed
+ // cases).
+ leecherClientConfig.MinPeerExtensions.SetBit(pp.ExtensionBitFast, false)
justOneNetwork(leecherClientConfig)
leecherClient, err := torrent.NewClient(leecherClientConfig)
require.NoError(t, err)
import (
"testing"
"time"
+
+ pp "github.com/anacrolix/torrent/peer_protocol"
)
func TestingConfig(t testing.TB) *ClientConfig {
cfg.DisableAcceptRateLimiting = true
cfg.ListenPort = 0
cfg.KeepAliveTimeout = time.Millisecond
+ cfg.MinPeerExtensions.SetBit(pp.ExtensionBitFast, true)
//cfg.Debug = true
//cfg.Logger = cfg.Logger.WithText(func(m log.Msg) string {
// t := m.Text()
func TestTorrentMetainfoIncompleteMetadata(t *testing.T) {
cfg := TestingConfig(t)
cfg.Debug = true
+ // Disable this just because we manually initiate a connection without it.
+ cfg.MinPeerExtensions.SetBit(pp.ExtensionBitFast, false)
cl, err := NewClient(cfg)
require.NoError(t, err)
defer cl.Close()