]> Sergey Matveev's repositories - btrtrc.git/blobdiff - webtorrent/tracker-client.go
Add WebRTC ICE servers config (#824)
[btrtrc.git] / webtorrent / tracker-client.go
index 195c06b033dee4c1bf743b64df37a6ad38ea859f..bc9dab312e2d64acf843f46d423b424e1514ebad 100644 (file)
@@ -5,17 +5,18 @@ import (
        "crypto/rand"
        "encoding/json"
        "fmt"
-       "github.com/anacrolix/generics"
-       "go.opentelemetry.io/otel/trace"
+       "net/http"
        "sync"
        "time"
 
+       g "github.com/anacrolix/generics"
        "github.com/anacrolix/log"
-
-       "github.com/anacrolix/torrent/tracker"
        "github.com/gorilla/websocket"
        "github.com/pion/datachannel"
        "github.com/pion/webrtc/v3"
+       "go.opentelemetry.io/otel/trace"
+
+       "github.com/anacrolix/torrent/tracker"
 )
 
 type TrackerClientStats struct {
@@ -40,6 +41,9 @@ type TrackerClient struct {
        closed         bool
        stats          TrackerClientStats
        pingTicker     *time.Ticker
+
+       WebsocketTrackerHttpHeader func() http.Header
+       ICEServers                 []string
 }
 
 func (me *TrackerClient) Stats() TrackerClientStats {
@@ -86,7 +90,13 @@ func (tc *TrackerClient) doWebsocket() error {
        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)
        }
@@ -224,14 +234,16 @@ func (tc *TrackerClient) Announce(event tracker.AnnounceEvent, infoHash [20]byte
                return fmt.Errorf("creating offer: %w", err)
        }
 
-       err = tc.announce(event, infoHash, []outboundOffer{{
-               offerId: offerIDBinary,
-               outboundOfferValue: outboundOfferValue{
-                       originalOffer:  offer,
-                       peerConnection: pc,
-                       infoHash:       infoHash,
-                       dataChannel:    dc,
-               }},
+       err = tc.announce(event, infoHash, []outboundOffer{
+               {
+                       offerId: offerIDBinary,
+                       outboundOfferValue: outboundOfferValue{
+                               originalOffer:  offer,
+                               peerConnection: pc,
+                               infoHash:       infoHash,
+                               dataChannel:    dc,
+                       },
+               },
        })
        if err != nil {
                dc.Close()
@@ -275,7 +287,7 @@ func (tc *TrackerClient) announce(event tracker.AnnounceEvent, infoHash [20]byte
                return fmt.Errorf("write AnnounceRequest: %w", err)
        }
        for _, offer := range offers {
-               generics.MakeMapIfNilAndSet(&tc.outboundOffers, offer.offerId, offer.outboundOfferValue)
+               g.MakeMapIfNilAndSet(&tc.outboundOffers, offer.offerId, offer.outboundOfferValue)
        }
        return nil
 }