X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=tracker%2Fhttp%2Fscrape.go;fp=tracker%2Fhttp%2Fscrape.go;h=6940370f5451febf5a6eb05b27a689e4c4b87ed7;hb=11833b45cfbec636653d64cec3f8db42d70f051e;hp=0000000000000000000000000000000000000000;hpb=cff4595d060c5d4e5a5ccc04e4b3f489f7759b0a;p=btrtrc.git diff --git a/tracker/http/scrape.go b/tracker/http/scrape.go new file mode 100644 index 00000000..6940370f --- /dev/null +++ b/tracker/http/scrape.go @@ -0,0 +1,47 @@ +package httpTracker + +import ( + "context" + "log" + "net/http" + "net/url" + + "github.com/anacrolix/torrent/bencode" + "github.com/anacrolix/torrent/tracker/udp" + "github.com/anacrolix/torrent/types/infohash" +) + +type scrapeResponse struct { + Files files `bencode:"files"` +} + +// Bencode should support bencode.Unmarshalers from a string in the dict key position. +type files = map[string]udp.ScrapeInfohashResult + +func (cl Client) Scrape(ctx context.Context, ihs []infohash.T) (out udp.ScrapeResponse, err error) { + _url := cl.url_.JoinPath("..", "scrape") + query, err := url.ParseQuery(_url.RawQuery) + if err != nil { + return + } + for _, ih := range ihs { + query.Add("info_hash", ih.AsString()) + } + _url.RawQuery = query.Encode() + log.Printf("%q", _url.String()) + req, err := http.NewRequestWithContext(ctx, http.MethodGet, _url.String(), nil) + if err != nil { + return + } + resp, err := cl.hc.Do(req) + if err != nil { + return + } + defer resp.Body.Close() + var decodedResp scrapeResponse + err = bencode.NewDecoder(resp.Body).Decode(&decodedResp) + for _, ih := range ihs { + out = append(out, decodedResp.Files[ih.AsString()]) + } + return +}