8 "github.com/anacrolix/log"
10 "github.com/anacrolix/torrent/bencode"
11 "github.com/anacrolix/torrent/metainfo"
14 // Add HTTP endpoints that serve the metainfo. They will be used if the torrent info isn't obtained
15 // yet. The Client HTTP client is used.
16 func (t *Torrent) UseSources(sources []string) {
24 for _, s := range sources {
25 _, loaded := t.activeSources.LoadOrStore(s, struct{}{})
31 err := t.useActiveTorrentSource(s)
32 _, loaded := t.activeSources.LoadAndDelete(s)
40 t.logger.Levelf(level, "used torrent source %q [err=%v]", s, err)
45 func (t *Torrent) useActiveTorrentSource(source string) error {
46 ctx, cancel := context.WithCancel(context.Background())
56 mi, err := getTorrentSource(ctx, source, t.cl.httpClient)
60 return t.MergeSpec(TorrentSpecFromMetaInfo(&mi))
63 func getTorrentSource(ctx context.Context, source string, hc *http.Client) (mi metainfo.MetaInfo, err error) {
65 if req, err = http.NewRequestWithContext(ctx, http.MethodGet, source, nil); err != nil {
68 var resp *http.Response
69 if resp, err = hc.Do(req); err != nil {
72 defer resp.Body.Close()
73 if resp.StatusCode != http.StatusOK {
74 err = fmt.Errorf("unexpected response status code: %v", resp.StatusCode)
77 err = bencode.NewDecoder(resp.Body).Decode(&mi)