cmd/tracker-announce/main.go | 2 +- config.go | 6 ++++++ tracker/http.go | 3 ++- tracker/http_test.go | 2 ++ tracker/tracker.go | 8 ++++---- tracker/tracker_test.go | 2 +- tracker/udp_test.go | 8 ++++---- tracker_scraper.go | 2 +- diff --git a/cmd/tracker-announce/main.go b/cmd/tracker-announce/main.go index 9c99a3b1a0a3f441f25e7ead23d127e4993aa60a..4622a18185233825ade24d4417a30d4409813341 100644 --- a/cmd/tracker-announce/main.go +++ b/cmd/tracker-announce/main.go @@ -39,7 +39,7 @@ } ar.InfoHash = ts.InfoHash for _, tier := range ts.Trackers { for _, tURI := range tier { - resp, err := tracker.Announce(torrent.DefaultHTTPClient, tURI, &ar) + resp, err := tracker.Announce(torrent.DefaultHTTPClient, torrent.DefaultHTTPUserAgent, tURI, &ar) if err != nil { log.Print(err) continue diff --git a/config.go b/config.go index 08b35be4f8423737a4020c07b70bf76f1721ff6c..99ce36b0d3f74b55bd048316226cb32e567873d2 100644 --- a/config.go +++ b/config.go @@ -23,6 +23,7 @@ TLSHandshakeTimeout: 15 * time.Second, TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, }, } +var DefaultHTTPUserAgent = "Go-Torrent/1.0" // Override Client defaults. type Config struct { @@ -78,6 +79,8 @@ Debug bool `help:"enable debugging"` // HTTP client used to query the tracker endpoint. Default is DefaultHTTPClient HTTP *http.Client + // HTTPUserAgent changes default UserAgent for HTTP requests + HTTPUserAgent string `long:"http-user-agent"` // Updated occasionally to when there's been some changes to client // behaviour in case other clients are assuming anything of us. See also // `bep20`. @@ -103,6 +106,9 @@ func (cfg *Config) setDefaults() { if cfg.HTTP == nil { cfg.HTTP = DefaultHTTPClient + } + if cfg.HTTPUserAgent == "" { + cfg.HTTPUserAgent = DefaultHTTPUserAgent } if cfg.ExtendedHandshakeClientVersion == "" { cfg.ExtendedHandshakeClientVersion = "go.torrent dev 20150624" diff --git a/tracker/http.go b/tracker/http.go index b0ab3f95bee9f7985842992da703456d05aaaa64..6767a6725217f4ba72f5b3e47e18f1dde32dc8cd 100644 --- a/tracker/http.go +++ b/tracker/http.go @@ -73,10 +73,11 @@ _url.RawQuery = q.Encode() } -func announceHTTP(cl *http.Client, ar *AnnounceRequest, _url *url.URL, host string) (ret AnnounceResponse, err error) { +func announceHTTP(cl *http.Client, userAgent string, ar *AnnounceRequest, _url *url.URL, host string) (ret AnnounceResponse, err error) { _url = httptoo.CopyURL(_url) setAnnounceParams(_url, ar) req, err := http.NewRequest("GET", _url.String(), nil) + req.Header.Set("User-Agent", userAgent) req.Host = host resp, err := cl.Do(req) if err != nil { diff --git a/tracker/http_test.go b/tracker/http_test.go index e081f63917b62bb0e7a261b8b20e5d45ae6fa58b..d658d62c218990fbff12dfa9942a63ebf3a411f6 100644 --- a/tracker/http_test.go +++ b/tracker/http_test.go @@ -9,6 +9,8 @@ "github.com/anacrolix/torrent/bencode" ) +var defaultHTTPUserAgent = "Go-Torrent" + func TestUnmarshalHTTPResponsePeerDicts(t *testing.T) { var hr httpResponse require.NoError(t, bencode.Unmarshal([]byte("d5:peersl"+ diff --git a/tracker/tracker.go b/tracker/tracker.go index 4ed76f11f4115ccb39965171fc2aecf33c7b2740..a2176f51ca3dd94a86aea6b4b5d4135a44821a69 100644 --- a/tracker/tracker.go +++ b/tracker/tracker.go @@ -54,18 +54,18 @@ var ( ErrBadScheme = errors.New("unknown scheme") ) -func Announce(cl *http.Client, urlStr string, req *AnnounceRequest) (res AnnounceResponse, err error) { - return AnnounceHost(cl, urlStr, req, "") +func Announce(cl *http.Client, userAgent string, urlStr string, req *AnnounceRequest) (res AnnounceResponse, err error) { + return AnnounceHost(cl, userAgent, urlStr, req, "") } -func AnnounceHost(cl *http.Client, urlStr string, req *AnnounceRequest, host string) (res AnnounceResponse, err error) { +func AnnounceHost(cl *http.Client, userAgent string, urlStr string, req *AnnounceRequest, host string) (res AnnounceResponse, err error) { _url, err := url.Parse(urlStr) if err != nil { return } switch _url.Scheme { case "http", "https": - return announceHTTP(cl, req, _url, host) + return announceHTTP(cl, userAgent, req, _url, host) case "udp": return announceUDP(req, _url) default: diff --git a/tracker/tracker_test.go b/tracker/tracker_test.go index bf397e9d0af90231594a637b7be08a1e94b9c5a5..24157ec6e017ee77f2259984effc928ecf4a596f 100644 --- a/tracker/tracker_test.go +++ b/tracker/tracker_test.go @@ -21,7 +21,7 @@ } func TestUnsupportedTrackerScheme(t *testing.T) { t.Parallel() - _, err := Announce(defaultClient, "lol://tracker.openbittorrent.com:80/announce", nil) + _, err := Announce(defaultClient, defaultHTTPUserAgent, "lol://tracker.openbittorrent.com:80/announce", nil) if err != ErrBadScheme { t.Fatal(err) } diff --git a/tracker/udp_test.go b/tracker/udp_test.go index 78434d328dd73e40d19ffbf4f54242920f3b3da7..61ff8c5848287c732aac193b392b51c1cf37fa11 100644 --- a/tracker/udp_test.go +++ b/tracker/udp_test.go @@ -114,7 +114,7 @@ copy(req.InfoHash[:], []uint8{0xa3, 0x56, 0x41, 0x43, 0x74, 0x23, 0xe6, 0x26, 0xd9, 0x38, 0x25, 0x4a, 0x6b, 0x80, 0x49, 0x10, 0xa6, 0x67, 0xa, 0xc1}) go func() { require.NoError(t, srv.serveOne()) }() - ar, err := Announce(defaultClient, fmt.Sprintf("udp://%s/announce", srv.pc.LocalAddr().String()), &req) + ar, err := Announce(defaultClient, defaultHTTPUserAgent, fmt.Sprintf("udp://%s/announce", srv.pc.LocalAddr().String()), &req) require.NoError(t, err) assert.EqualValues(t, 1, ar.Seeders) assert.EqualValues(t, 2, len(ar.Peers)) @@ -130,7 +130,7 @@ NumWant: -1, } rand.Read(req.PeerId[:]) copy(req.InfoHash[:], []uint8{0xa3, 0x56, 0x41, 0x43, 0x74, 0x23, 0xe6, 0x26, 0xd9, 0x38, 0x25, 0x4a, 0x6b, 0x80, 0x49, 0x10, 0xa6, 0x67, 0xa, 0xc1}) - ar, err := Announce(defaultClient, "udp://tracker.openbittorrent.com:80/announce", &req) + ar, err := Announce(defaultClient, defaultHTTPUserAgent, "udp://tracker.openbittorrent.com:80/announce", &req) // Skip any net errors as we don't control the server. if _, ok := err.(net.Error); ok { t.Skip(err) @@ -166,7 +166,7 @@ } { wg.Add(1) go func(url string) { defer wg.Done() - resp, err := Announce(defaultClient, url, &req) + resp, err := Announce(defaultClient, defaultHTTPUserAgent, url, &req) if err != nil { t.Logf("error announcing to %s: %s", url, err) return @@ -202,7 +202,7 @@ panic(err) } defer conn.Close() go func() { - _, err := Announce(defaultClient, (&url.URL{ + _, err := Announce(defaultClient, defaultHTTPUserAgent, (&url.URL{ Scheme: "udp", Host: conn.LocalAddr().String(), Path: "/announce", diff --git a/tracker_scraper.go b/tracker_scraper.go index a090bc1d7603a7b57b1315d76a5135404a01f84b..7434bdccda4cc58afeb53ea97c8a104aa12b0184 100644 --- a/tracker_scraper.go +++ b/tracker_scraper.go @@ -85,7 +85,7 @@ } me.t.cl.mu.Lock() req := me.t.announceRequest() me.t.cl.mu.Unlock() - res, err := tracker.AnnounceHost(me.t.cl.config.HTTP, urlToUse, &req, host) + res, err := tracker.AnnounceHost(me.t.cl.config.HTTP, me.t.cl.config.HTTPUserAgent, urlToUse, &req, host) if err != nil { ret.Err = err return