7 "github.com/anacrolix/log"
8 "github.com/anacrolix/torrent/bencode"
9 "github.com/anacrolix/torrent/metainfo"
12 func (t *Torrent) useSources(sources []string) {
20 for _, s := range sources {
21 _, loaded := t.activeSources.LoadOrStore(s, struct{}{})
27 err := t.useActiveTorrentSource(s)
28 _, loaded := t.activeSources.LoadAndDelete(s)
36 t.logger.Levelf(level, "used torrent source %q [err=%q]", s, err)
41 func (t *Torrent) useActiveTorrentSource(source string) error {
42 ctx, cancel := context.WithCancel(context.Background())
52 mi, err := getTorrentSource(ctx, source, t.cl.httpClient)
56 return t.MergeSpec(TorrentSpecFromMetaInfo(&mi))
59 func getTorrentSource(ctx context.Context, source string, hc *http.Client) (mi metainfo.MetaInfo, err error) {
61 if req, err = http.NewRequestWithContext(ctx, http.MethodGet, source, nil); err != nil {
64 var resp *http.Response
65 if resp, err = hc.Do(req); err != nil {
68 defer resp.Body.Close()
69 err = bencode.NewDecoder(resp.Body).Decode(&mi)