From 9794dfc8d267e1d95661f3c99709abe1dfd70655 Mon Sep 17 00:00:00 2001 From: Matt Joiner Date: Thu, 3 Jul 2025 16:05:15 +1000 Subject: [PATCH] Add separate webseed rate limit option --- torrent.go | 26 +++++++++++++++++--------- webseed/client.go | 6 ++++-- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/torrent.go b/torrent.go index ae90090a..c0a404b4 100644 --- a/torrent.go +++ b/torrent.go @@ -37,6 +37,7 @@ import ( "github.com/anacrolix/sync" "github.com/pion/webrtc/v4" "golang.org/x/sync/errgroup" + "golang.org/x/time/rate" "github.com/anacrolix/torrent/bencode" "github.com/anacrolix/torrent/internal/check" @@ -3012,6 +3013,12 @@ func WebSeedPathEscaper(custom webseed.PathEscaper) AddWebSeedsOpt { } } +func WebSeedResponseBodyRateLimiter(rl *rate.Limiter) AddWebSeedsOpt { + return func(wc *webseed.Client) { + wc.ResponseBodyRateLimiter = rl + } +} + func (t *Torrent) AddWebSeeds(urls []string, opts ...AddWebSeedsOpt) { t.cl.lock() defer t.cl.unlock() @@ -3046,15 +3053,10 @@ func (t *Torrent) addWebSeed(url string, opts ...AddWebSeedsOpt) bool { callbacks: t.callbacks(), }, client: webseed.Client{ - HttpClient: t.cl.httpClient, - Url: url, - MaxRequests: defaultMaxRequests, - ResponseBodyWrapper: func(r io.Reader) io.Reader { - return &rateLimitedReader{ - l: t.cl.config.DownloadRateLimiter, - r: r, - } - }, + HttpClient: t.cl.httpClient, + Url: url, + MaxRequests: defaultMaxRequests, + ResponseBodyRateLimiter: t.cl.config.DownloadRateLimiter, }, hostKey: t.deriveWebSeedHostKey(url), } @@ -3062,6 +3064,12 @@ func (t *Torrent) addWebSeed(url string, opts ...AddWebSeedsOpt) bool { for _, opt := range opts { opt(&ws.client) } + ws.client.ResponseBodyWrapper = func(r io.Reader) io.Reader { + return &rateLimitedReader{ + l: ws.client.ResponseBodyRateLimiter, + r: r, + } + } g.MakeMapWithCap(&ws.activeRequests, ws.client.MaxRequests) // TODO: Implement an algorithm that assigns this based on sharing chunks across peers. For now // we just allow 2 MiB worth of requests. See newHotPeerImpl.nominalMaxRequests. diff --git a/webseed/client.go b/webseed/client.go index ac58ec54..4d774732 100644 --- a/webseed/client.go +++ b/webseed/client.go @@ -13,6 +13,7 @@ import ( "github.com/RoaringBitmap/roaring" "github.com/anacrolix/missinggo/v2/panicif" "github.com/dustin/go-humanize" + "golang.org/x/time/rate" "github.com/anacrolix/torrent/metainfo" "github.com/anacrolix/torrent/segments" @@ -67,8 +68,9 @@ type Client struct { // webseedPeer. Pieces roaring.Bitmap // This wraps http.Response bodies, for example to limit the download rate. - ResponseBodyWrapper ResponseBodyWrapper - PathEscaper PathEscaper + ResponseBodyWrapper ResponseBodyWrapper + ResponseBodyRateLimiter *rate.Limiter + PathEscaper PathEscaper } type ResponseBodyWrapper func(io.Reader) io.Reader -- 2.51.0