}
return t.announceRequest(event), nil
},
- Proxy: cl.config.HTTPProxy,
- DialContext: cl.config.TrackerDialContext,
+ Proxy: cl.config.HTTPProxy,
+ WebsocketTrackerHttpHeader: cl.config.WebsocketTrackerHttpHeader,
+ DialContext: cl.config.TrackerDialContext,
OnConn: func(dc datachannel.ReadWriteCloser, dcc webtorrent.DataChannelContext) {
cl.lock()
defer cl.unlock()
// HttpRequestDirector modifies the request before it's sent.
// Useful for adding authentication headers, for example
HttpRequestDirector func(*http.Request) error
+ // WebsocketTrackerHttpHeader returns a custom header to be used when dialing a websocket connection
+ // to the tracker. Useful for adding authentication headers
+ WebsocketTrackerHttpHeader func() http.Header
// Updated occasionally to when there's been some changes to client
// behaviour in case other clients are assuming anything of us. See also
// `bep20`.
"crypto/rand"
"encoding/json"
"fmt"
+ "net/http"
"sync"
"time"
closed bool
stats TrackerClientStats
pingTicker *time.Ticker
+
+ WebsocketTrackerHttpHeader func() http.Header
}
func (me *TrackerClient) Stats() TrackerClientStats {
tc.mu.Lock()
tc.stats.Dials++
tc.mu.Unlock()
- c, _, err := tc.Dialer.Dial(tc.Url, nil)
+
+ var header http.Header
+ if tc.WebsocketTrackerHttpHeader != nil {
+ header = tc.WebsocketTrackerHttpHeader()
+ }
+
+ c, _, err := tc.Dialer.Dial(tc.Url, header)
if err != nil {
return fmt.Errorf("dialing tracker: %w", err)
}
"context"
"fmt"
"net"
+ netHttp "net/http"
"net/url"
"sync"
"github.com/pion/datachannel"
"github.com/anacrolix/torrent/tracker"
- "github.com/anacrolix/torrent/tracker/http"
+ httpTracker "github.com/anacrolix/torrent/tracker/http"
"github.com/anacrolix/torrent/webtorrent"
)
}
type websocketTrackers struct {
- PeerId [20]byte
- Logger log.Logger
- GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
- OnConn func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
- mu sync.Mutex
- clients map[string]*refCountedWebtorrentTrackerClient
- Proxy httpTracker.ProxyFunc
- DialContext func(ctx context.Context, network, addr string) (net.Conn, error)
+ PeerId [20]byte
+ Logger log.Logger
+ GetAnnounceRequest func(event tracker.AnnounceEvent, infoHash [20]byte) (tracker.AnnounceRequest, error)
+ OnConn func(datachannel.ReadWriteCloser, webtorrent.DataChannelContext)
+ mu sync.Mutex
+ clients map[string]*refCountedWebtorrentTrackerClient
+ Proxy httpTracker.ProxyFunc
+ DialContext func(ctx context.Context, network, addr string) (net.Conn, error)
+ WebsocketTrackerHttpHeader func() netHttp.Header
}
func (me *websocketTrackers) Get(url string, infoHash [20]byte) (*webtorrent.TrackerClient, func()) {
Logger: me.Logger.WithText(func(m log.Msg) string {
return fmt.Sprintf("tracker client for %q: %v", url, m)
}),
+ WebsocketTrackerHttpHeader: me.WebsocketTrackerHttpHeader,
},
}
value.TrackerClient.Start(func(err error) {