"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"
}
}
+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()
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),
}
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.
"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"
// 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