X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=wstracker.go;h=c379dc312030dbfac9483509e81e3bbbb6505b4f;hb=044be4820fd437a4d13e5d6505808aeb6b2875aa;hp=f93f784a7f3c87c0bdc458d2d5f3fef38b4e29df;hpb=ae28d0e0e433761ee3cb6999fd9b630df3ef35ed;p=btrtrc.git diff --git a/wstracker.go b/wstracker.go index f93f784a..c379dc31 100644 --- a/wstracker.go +++ b/wstracker.go @@ -1,15 +1,20 @@ package torrent import ( + "context" "fmt" + "net" + netHttp "net/http" "net/url" "sync" "github.com/anacrolix/log" + "github.com/gorilla/websocket" + "github.com/pion/datachannel" "github.com/anacrolix/torrent/tracker" + httpTracker "github.com/anacrolix/torrent/tracker/http" "github.com/anacrolix/torrent/webtorrent" - "github.com/pion/datachannel" ) type websocketTrackerStatus struct { @@ -31,21 +36,26 @@ type refCountedWebtorrentTrackerClient struct { } 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 + 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) (*webtorrent.TrackerClient, func()) { +func (me *websocketTrackers) Get(url string, infoHash [20]byte) (*webtorrent.TrackerClient, func()) { me.mu.Lock() defer me.mu.Unlock() value, ok := me.clients[url] if !ok { + dialer := &websocket.Dialer{Proxy: me.Proxy, NetDialContext: me.DialContext, HandshakeTimeout: websocket.DefaultDialer.HandshakeTimeout} value = &refCountedWebtorrentTrackerClient{ TrackerClient: webtorrent.TrackerClient{ + Dialer: dialer, Url: url, GetAnnounceRequest: me.GetAnnounceRequest, PeerId: me.PeerId, @@ -53,6 +63,7 @@ func (me *websocketTrackers) Get(url string) (*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) { @@ -69,6 +80,7 @@ func (me *websocketTrackers) Get(url string) (*webtorrent.TrackerClient, func()) return &value.TrackerClient, func() { me.mu.Lock() defer me.mu.Unlock() + value.TrackerClient.CloseOffersForInfohash(infoHash) value.refCount-- if value.refCount == 0 { value.TrackerClient.Close()