]> Sergey Matveev's repositories - btrtrc.git/blobdiff - tracker/tracker.go
Drop support for go 1.20
[btrtrc.git] / tracker / tracker.go
index edc84dcc941125df40be01ef68e1d3b4bcc6a602..e96a08a1175e63dc439b4865ae15288b7defbf03 100644 (file)
@@ -3,11 +3,15 @@ package tracker
 import (
        "context"
        "errors"
+       "fmt"
+       "net"
        "net/http"
        "net/url"
        "time"
 
        "github.com/anacrolix/dht/v2/krpc"
+       "github.com/anacrolix/log"
+
        trHttp "github.com/anacrolix/torrent/tracker/http"
        "github.com/anacrolix/torrent/tracker/shared"
        "github.com/anacrolix/torrent/tracker/udp"
@@ -28,23 +32,25 @@ type Peer = trHttp.Peer
 
 type AnnounceEvent = udp.AnnounceEvent
 
-var (
-       ErrBadScheme = errors.New("unknown scheme")
-)
+var ErrBadScheme = errors.New("unknown scheme")
 
 type Announce struct {
-       TrackerUrl string
-       Request    AnnounceRequest
-       HostHeader string
-       HTTPProxy  func(*http.Request) (*url.URL, error)
-       ServerName string
-       UserAgent  string
-       UdpNetwork string
+       TrackerUrl          string
+       Request             AnnounceRequest
+       HostHeader          string
+       HttpProxy           func(*http.Request) (*url.URL, error)
+       HttpRequestDirector func(*http.Request) error
+       DialContext         func(ctx context.Context, network, addr string) (net.Conn, error)
+       ListenPacket        func(network, addr string) (net.PacketConn, error)
+       ServerName          string
+       UserAgent           string
+       UdpNetwork          string
        // If the port is zero, it's assumed to be the same as the Request.Port.
        ClientIp4 krpc.NodeAddr
        // If the port is zero, it's assumed to be the same as the Request.Port.
        ClientIp6 krpc.NodeAddr
        Context   context.Context
+       Logger    log.Logger
 }
 
 // The code *is* the documentation.
@@ -53,10 +59,13 @@ const DefaultTrackerAnnounceTimeout = 15 * time.Second
 func (me Announce) Do() (res AnnounceResponse, err error) {
        cl, err := NewClient(me.TrackerUrl, NewClientOpts{
                Http: trHttp.NewClientOpts{
-                       Proxy:      me.HTTPProxy,
-                       ServerName: me.ServerName,
+                       Proxy:       me.HttpProxy,
+                       DialContext: me.DialContext,
+                       ServerName:  me.ServerName,
                },
-               UdpNetwork: me.UdpNetwork,
+               UdpNetwork:   me.UdpNetwork,
+               Logger:       me.Logger.WithContextValue(fmt.Sprintf("tracker client for %q", me.TrackerUrl)),
+               ListenPacket: me.ListenPacket,
        })
        if err != nil {
                return
@@ -71,9 +80,10 @@ func (me Announce) Do() (res AnnounceResponse, err error) {
                me.Context = ctx
        }
        return cl.Announce(me.Context, me.Request, trHttp.AnnounceOpt{
-               UserAgent:  me.UserAgent,
-               HostHeader: me.HostHeader,
-               ClientIp4:  me.ClientIp4.IP,
-               ClientIp6:  me.ClientIp6.IP,
+               UserAgent:           me.UserAgent,
+               HostHeader:          me.HostHeader,
+               ClientIp4:           me.ClientIp4.IP,
+               ClientIp6:           me.ClientIp6.IP,
+               HttpRequestDirector: me.HttpRequestDirector,
        })
 }