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