in tracker/announceclient/client.go [109:148]
func (c *client) Announce(
d core.Digest,
h core.InfoHash,
complete bool,
version int) (peers []*core.PeerInfo, interval time.Duration, err error) {
body, err := json.Marshal(&Request{
Name: d.Hex(), // For backwards compatability. TODO(codyg): Remove.
Digest: &d,
InfoHash: h,
Peer: core.PeerInfoFromContext(c.pctx, complete),
})
if err != nil {
return nil, 0, fmt.Errorf("marshal request: %s", err)
}
var httpResp *http.Response
for _, addr := range c.ring.Locations(d) {
method, url := getEndpoint(version, addr, h)
httpResp, err = httputil.Send(
method,
url,
httputil.SendBody(bytes.NewReader(body)),
httputil.SendTimeout(10*time.Second),
httputil.SendTLS(c.tls))
if err != nil {
if httputil.IsNetworkError(err) {
c.ring.Failed(addr)
continue
}
return nil, 0, err
}
defer httpResp.Body.Close()
var resp Response
if err := json.NewDecoder(httpResp.Body).Decode(&resp); err != nil {
return nil, 0, fmt.Errorf("decode response: %s", err)
}
return resp.Peers, resp.Interval, nil
}
return nil, 0, err
}