github.com/anacrolix/torrent@v1.61.0/tracker/client.go (about) 1 package tracker 2 3 import ( 4 "context" 5 "net" 6 "net/url" 7 8 "github.com/anacrolix/log" 9 10 trHttp "github.com/anacrolix/torrent/tracker/http" 11 "github.com/anacrolix/torrent/tracker/udp" 12 "github.com/anacrolix/torrent/types/infohash" 13 ) 14 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) 18 Close() error 19 } 20 21 type AnnounceOpt = trHttp.AnnounceOpt 22 23 type NewClientOpts struct { 24 Http trHttp.NewClientOpts 25 // Overrides the network in the scheme. Probably a legacy thing. 26 UdpNetwork string 27 Logger log.Logger 28 ListenPacket func(network, addr string) (net.PacketConn, error) 29 } 30 31 func NewClient(urlStr string, opts NewClientOpts) (Client, error) { 32 _url, err := url.Parse(urlStr) 33 if err != nil { 34 return nil, err 35 } 36 switch _url.Scheme { 37 case "http", "https": 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 43 } 44 cc, err := udp.NewConnClient(udp.NewConnClientOpts{ 45 Network: network, 46 Host: _url.Host, 47 Logger: opts.Logger.Slogger(), 48 ListenPacket: opts.ListenPacket, 49 }) 50 if err != nil { 51 return nil, err 52 } 53 return &udpClient{ 54 cl: cc, 55 requestUri: _url.RequestURI(), 56 }, nil 57 default: 58 return nil, ErrBadScheme 59 } 60 }