LookupTrackerIp func(*url.URL) ([]net.IP, error)
// HTTPUserAgent changes default UserAgent for HTTP requests
HTTPUserAgent string
+ // HTTPRequestDirector modifies the request before it's sent.
+ // Useful for adding authentication headers, for example
+ HTTPRequestDirector func(*http.Request) error
// Updated occasionally to when there's been some changes to client
// behaviour in case other clients are assuming anything of us. See also
// `bep20`.
}
type AnnounceOpt struct {
- UserAgent string
- HostHeader string
- ClientIp4 net.IP
- ClientIp6 net.IP
+ UserAgent string
+ HostHeader string
+ ClientIp4 net.IP
+ ClientIp6 net.IP
+ HTTPRequestDirector func(*http.Request) error
}
type AnnounceRequest = udp.AnnounceRequest
if userAgent != "" {
req.Header.Set("User-Agent", userAgent)
}
+
+ if opt.HTTPRequestDirector != nil {
+ err = opt.HTTPRequestDirector(req)
+ if err != nil {
+ err = fmt.Errorf("error modifying HTTP request: %s", err)
+ return
+ }
+ }
+
req.Host = opt.HostHeader
resp, err := cl.hc.Do(req)
if err != nil {
var ErrBadScheme = errors.New("unknown scheme")
type Announce struct {
- TrackerUrl string
- Request AnnounceRequest
- HostHeader string
- HTTPProxy func(*http.Request) (*url.URL, 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
+ 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.
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,
})
}
defer cancel()
me.t.logger.WithDefaultLevel(log.Debug).Printf("announcing to %q: %#v", me.u.String(), req)
res, err := tracker.Announce{
- Context: ctx,
- HTTPProxy: me.t.cl.config.HTTPProxy,
- DialContext: me.t.cl.config.TrackerDialContext,
- ListenPacket: me.t.cl.config.TrackerListenPacket,
- UserAgent: me.t.cl.config.HTTPUserAgent,
- TrackerUrl: me.trackerUrl(ip),
- Request: req,
- HostHeader: me.u.Host,
- ServerName: me.u.Hostname(),
- 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,
+ Context: ctx,
+ HTTPProxy: me.t.cl.config.HTTPProxy,
+ HTTPRequestDirector: me.t.cl.config.HTTPRequestDirector,
+ DialContext: me.t.cl.config.TrackerDialContext,
+ ListenPacket: me.t.cl.config.TrackerListenPacket,
+ UserAgent: me.t.cl.config.HTTPUserAgent,
+ TrackerUrl: me.trackerUrl(ip),
+ Request: req,
+ HostHeader: me.u.Host,
+ ServerName: me.u.Hostname(),
+ 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 {