"context"
"net/url"
+ "github.com/anacrolix/log"
trHttp "github.com/anacrolix/torrent/tracker/http"
"github.com/anacrolix/torrent/tracker/udp"
)
Http trHttp.NewClientOpts
// Overrides the network in the scheme. Probably a legacy thing.
UdpNetwork string
+ Logger log.Logger
}
func NewClient(urlStr string, opts NewClientOpts) (Client, error) {
cc, err := udp.NewConnClient(udp.NewConnClientOpts{
Network: network,
Host: _url.Host,
+ Logger: opts.Logger,
})
if err != nil {
return nil, err
import (
"context"
"errors"
+ "fmt"
"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"
// 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.
ServerName: me.ServerName,
},
UdpNetwork: me.UdpNetwork,
+ Logger: me.Logger.WithContextValue(fmt.Sprintf("tracker client for %q", me.TrackerUrl)),
})
if err != nil {
return
import (
"context"
- "log"
"net"
+ "github.com/anacrolix/log"
+
"github.com/anacrolix/missinggo/v2"
)
Host string
// If non-nil, forces either IPv4 or IPv6 in the UDP tracker wire protocol.
Ipv6 *bool
+ // Logger to use for internal errors.
+ Logger log.Logger
}
// Manages a Client with a specific connection.
}
err = cc.d.Dispatch(b[:n], addr)
if err != nil {
- log.Printf("dispatching packet received on %v: %v", cc.conn.LocalAddr(), err)
+ cc.newOpts.Logger.WithLevel(log.Debug).Printf("dispatching packet received on %v: %v", cc.conn.LocalAddr(), err)
}
}
}
if err != nil {
return
}
+ if opts.Logger.IsZero() {
+ opts.Logger = log.Default
+ }
cc = &ConnClient{
Client: Client{
Writer: clientWriter{
return
}
-func (c *ConnClient) Close() error {
- c.closed = true
- return c.conn.Close()
+func (cc *ConnClient) Close() error {
+ cc.closed = true
+ return cc.conn.Close()
}
-func (c *ConnClient) Announce(
+func (cc *ConnClient) Announce(
ctx context.Context, req AnnounceRequest, opts Options,
) (
h AnnounceResponseHeader, nas AnnounceResponsePeers, err error,
) {
- return c.Client.Announce(ctx, req, opts, func(addr net.Addr) bool {
- return ipv6(c.newOpts.Ipv6, c.newOpts.Network, addr)
+ return cc.Client.Announce(ctx, req, opts, func(addr net.Addr) bool {
+ return ipv6(cc.newOpts.Ipv6, cc.newOpts.Network, addr)
})
}
+
+func (cc *ConnClient) LocalAddr() net.Addr {
+ return cc.conn.LocalAddr()
+}
"testing"
"github.com/anacrolix/dht/v2/krpc"
+ qt "github.com/frankban/quicktest"
"github.com/stretchr/testify/require"
)
t.FailNow()
}
}
+
+func TestConnClientLogDispatchUnknownTransactionId(t *testing.T) {
+ const network = "udp"
+ cc, err := NewConnClient(NewConnClientOpts{
+ Network: network,
+ })
+ c := qt.New(t)
+ c.Assert(err, qt.IsNil)
+ defer cc.Close()
+ pc, err := net.ListenPacket(network, ":0")
+ c.Assert(err, qt.IsNil)
+ defer pc.Close()
+ ccAddr := *cc.LocalAddr().(*net.UDPAddr)
+ ccAddr.IP = net.IPv6loopback
+ _, err = pc.WriteTo(make([]byte, 30), &ccAddr)
+ c.Assert(err, qt.IsNil)
+}
UdpNetwork: me.u.Scheme,
ClientIp4: krpc.NodeAddr{IP: me.t.cl.config.PublicIp4},
ClientIp6: krpc.NodeAddr{IP: me.t.cl.config.PublicIp6},
+ Logger: me.t.logger,
}.Do()
me.t.logger.WithDefaultLevel(log.Debug).Printf("announce to %q returned %#v: %v", me.u.String(), res, err)
if err != nil {