Modify HTTP request before sending (#787)
* set up custom request headers * apply headers defined in torrent client config * add error handling * provide better name for method * update error message * only apply HTTPRequestDirector if not nil
This commit is contained in:
parent
436af2580f
commit
916af6e38a
@ -102,6 +102,9 @@ type ClientConfig struct {
|
||||
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`.
|
||||
|
@ -76,10 +76,11 @@ func setAnnounceParams(_url *url.URL, ar *AnnounceRequest, opts AnnounceOpt) {
|
||||
}
|
||||
|
||||
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
|
||||
@ -95,6 +96,15 @@ func (cl Client) Announce(ctx context.Context, ar AnnounceRequest, opt AnnounceO
|
||||
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 {
|
||||
|
@ -35,15 +35,16 @@ type AnnounceEvent = udp.AnnounceEvent
|
||||
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.
|
||||
@ -79,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,
|
||||
})
|
||||
}
|
||||
|
@ -156,19 +156,20 @@ func (me *trackerScraper) announce(ctx context.Context, event tracker.AnnounceEv
|
||||
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 {
|
||||
|
Loading…
x
Reference in New Issue
Block a user