client.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. package tracker
  2. import (
  3. "context"
  4. "net"
  5. "net/url"
  6. "github.com/anacrolix/log"
  7. trHttp "github.com/anacrolix/torrent/tracker/http"
  8. "github.com/anacrolix/torrent/tracker/udp"
  9. "github.com/anacrolix/torrent/types/infohash"
  10. )
  11. type Client interface {
  12. Announce(context.Context, AnnounceRequest, AnnounceOpt) (AnnounceResponse, error)
  13. Scrape(ctx context.Context, ihs []infohash.T) (out udp.ScrapeResponse, err error)
  14. Close() error
  15. }
  16. type AnnounceOpt = trHttp.AnnounceOpt
  17. type NewClientOpts struct {
  18. Http trHttp.NewClientOpts
  19. // Overrides the network in the scheme. Probably a legacy thing.
  20. UdpNetwork string
  21. Logger log.Logger
  22. ListenPacket func(network, addr string) (net.PacketConn, error)
  23. }
  24. func NewClient(urlStr string, opts NewClientOpts) (Client, error) {
  25. _url, err := url.Parse(urlStr)
  26. if err != nil {
  27. return nil, err
  28. }
  29. switch _url.Scheme {
  30. case "http", "https":
  31. return trHttp.NewClient(_url, opts.Http), nil
  32. case "udp", "udp4", "udp6":
  33. network := _url.Scheme
  34. if opts.UdpNetwork != "" {
  35. network = opts.UdpNetwork
  36. }
  37. cc, err := udp.NewConnClient(udp.NewConnClientOpts{
  38. Network: network,
  39. Host: _url.Host,
  40. Logger: opts.Logger,
  41. ListenPacket: opts.ListenPacket,
  42. })
  43. if err != nil {
  44. return nil, err
  45. }
  46. return &udpClient{
  47. cl: cc,
  48. requestUri: _url.RequestURI(),
  49. }, nil
  50. default:
  51. return nil, ErrBadScheme
  52. }
  53. }