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  }