]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Add separate webseed rate limit option
authorMatt Joiner <anacrolix@gmail.com>
Thu, 3 Jul 2025 06:05:15 +0000 (16:05 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Thu, 3 Jul 2025 06:05:15 +0000 (16:05 +1000)
torrent.go
webseed/client.go

index ae90090a765d5f620d5c90d18febbb449bb859f7..c0a404b49ec0e3810db991aefc22d2dd3707a7a9 100644 (file)
@@ -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.
index ac58ec54ca706eb9a42d3eaf6559eddb9d10a38c..4d7747326a92d0363bd80998e20ef5cf6945afc7 100644 (file)
@@ -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