]> Sergey Matveev's repositories - btrtrc.git/blob - tracker/client.go
Support scraping from HTTP trackers
[btrtrc.git] / tracker / client.go
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,
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 }