8 "github.com/anacrolix/log"
10 trHttp "github.com/anacrolix/torrent/tracker/http"
11 "github.com/anacrolix/torrent/tracker/udp"
12 "github.com/anacrolix/torrent/types/infohash"
15 type Client interface {
16 Announce(context.Context, AnnounceRequest, AnnounceOpt) (AnnounceResponse, error)
17 Scrape(ctx context.Context, ihs []infohash.T) (out udp.ScrapeResponse, err error)
21 type AnnounceOpt = trHttp.AnnounceOpt
23 type NewClientOpts struct {
24 Http trHttp.NewClientOpts
25 // Overrides the network in the scheme. Probably a legacy thing.
28 ListenPacket func(network, addr string) (net.PacketConn, error)
31 func NewClient(urlStr string, opts NewClientOpts) (Client, error) {
32 _url, err := url.Parse(urlStr)
38 return trHttp.NewClient(_url, opts.Http), nil
39 case "udp", "udp4", "udp6":
40 network := _url.Scheme
41 if opts.UdpNetwork != "" {
42 network = opts.UdpNetwork
44 cc, err := udp.NewConnClient(udp.NewConnClientOpts{
48 ListenPacket: opts.ListenPacket,
55 requestUri: _url.RequestURI(),
58 return nil, ErrBadScheme