"strconv"
"github.com/anacrolix/dht/v2/krpc"
+ "github.com/anacrolix/generics"
"github.com/anacrolix/log"
"github.com/anacrolix/torrent/bencode"
PeerId: peerId,
Event: event,
Port: addrPort.Port(),
- }, addrPort)
+ NumWant: -1,
+ }, addrPort, tracker.GetPeersOpts{generics.Some[uint](200)})
if err != nil {
log.Printf("error serving announce: %v", err)
http.Error(w, "error handling announce", http.StatusInternalServerError)
// This is reserved for stuff like filtering by IP version, avoiding an announcer's IP or key,
// limiting return count, etc.
-type GetPeersOpts struct{}
+type GetPeersOpts struct {
+ // Negative numbers are not allowed.
+ MaxCount generics.Option[uint]
+}
type InfoHash = [20]byte
}
func (me *AnnounceHandler) Serve(
- ctx context.Context, req AnnounceRequest, addr AnnounceAddr,
+ ctx context.Context, req AnnounceRequest, addr AnnounceAddr, opts GetPeersOpts,
) (peers []PeerInfo, err error) {
err = me.AnnounceTracker.TrackAnnounce(ctx, req, addr)
if err != nil {
me.mu.Lock()
op.Value, op.Ok = me.ongoingUpstreamAugmentations[infoHash]
me.mu.Unlock()
- peers, err = me.AnnounceTracker.GetPeers(ctx, infoHash, GetPeersOpts{})
+ // Apply num_want limit to max count. I really can't tell if this is the right place to do it,
+ // but it seems the most flexible.
+ if req.NumWant != -1 {
+ newCount := uint(req.NumWant)
+ if opts.MaxCount.Ok {
+ if newCount < opts.MaxCount.Value {
+ opts.MaxCount.Value = newCount
+ }
+ } else {
+ opts.MaxCount = generics.Some(newCount)
+ }
+ }
+ peers, err = me.AnnounceTracker.GetPeers(ctx, infoHash, opts)
if err != nil {
return
}
"net/netip"
"github.com/anacrolix/dht/v2/krpc"
+ "github.com/anacrolix/generics"
"github.com/anacrolix/log"
"github.com/anacrolix/torrent/tracker"
err = fmt.Errorf("converting source net.Addr to AnnounceAddr: %w", err)
return err
}
- peers, err := me.Announce.Serve(ctx, req, announceAddr)
+ opts := tracker.GetPeersOpts{MaxCount: generics.Some[uint](50)}
+ if addrFamily == udp.AddrFamilyIpv4 {
+ opts.MaxCount = generics.Some[uint](150)
+ }
+ peers, err := me.Announce.Serve(ctx, req, announceAddr, opts)
if err != nil {
return err
}