]> Sergey Matveev's repositories - btrtrc.git/commitdiff
Modify HTTP request before sending (#787)
authorMarco Vidonis <31407403+marcovidonis@users.noreply.github.com>
Mon, 28 Nov 2022 23:35:36 +0000 (23:35 +0000)
committerGitHub <noreply@github.com>
Mon, 28 Nov 2022 23:35:36 +0000 (10:35 +1100)
* 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

config.go
tracker/http/http.go
tracker/tracker.go
tracker_scraper.go

index 6f9f68277b1c46c9b98db2e6ea29e8885f210f69..f640e1a4a5984d0fc204579ba0aa62e823f99ec1 100644 (file)
--- a/config.go
+++ b/config.go
@@ -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`.
index 72a95c380bee959820ace7011c65ae903ee74a20..3c4d9052f2c944c48f4cba5947a09e433ee8d1e3 100644 (file)
@@ -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 {
index 122278b62bd442f0d8bf847f9143083a02af48d9..c169c6f56c46a8579d39b21b35d0f2d08dd144ab 100644 (file)
@@ -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,
        })
 }
index de65d9fbe30b84a512498fc29bcaa2dcf5050d93..3f20cbd9accd63790f28f29048f51abf13865801 100644 (file)
@@ -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 {