func()

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
}