8 "github.com/anacrolix/log"
9 "github.com/anacrolix/torrent/bencode"
10 "github.com/anacrolix/torrent/metainfo"
13 func (t *Torrent) useSources(sources []string) {
21 for _, s := range sources {
22 _, loaded := t.activeSources.LoadOrStore(s, struct{}{})
28 err := t.useActiveTorrentSource(s)
29 _, loaded := t.activeSources.LoadAndDelete(s)
37 t.logger.Levelf(level, "used torrent source %q [err=%v]", s, err)
42 func (t *Torrent) useActiveTorrentSource(source string) error {
43 ctx, cancel := context.WithCancel(context.Background())
53 mi, err := getTorrentSource(ctx, source, t.cl.httpClient)
57 return t.MergeSpec(TorrentSpecFromMetaInfo(&mi))
60 func getTorrentSource(ctx context.Context, source string, hc *http.Client) (mi metainfo.MetaInfo, err error) {
62 if req, err = http.NewRequestWithContext(ctx, http.MethodGet, source, nil); err != nil {
65 var resp *http.Response
66 if resp, err = hc.Do(req); err != nil {
69 defer resp.Body.Close()
70 if resp.StatusCode != http.StatusOK {
71 err = fmt.Errorf("unexpected response status code: %v", resp.StatusCode)
74 err = bencode.NewDecoder(resp.Body).Decode(&mi)