]> Sergey Matveev's repositories - btrtrc.git/commitdiff
adding http user-agent setters and usage
authorDenis Kuzmenok <denis.kuzmenok@gmail.com>
Thu, 28 Dec 2017 08:47:51 +0000 (10:47 +0200)
committerDenis Kuzmenok <denis.kuzmenok@gmail.com>
Thu, 28 Dec 2017 08:47:51 +0000 (10:47 +0200)
cmd/tracker-announce/main.go
config.go
tracker/http.go
tracker/http_test.go
tracker/tracker.go
tracker/tracker_test.go
tracker/udp_test.go
tracker_scraper.go

index 9c99a3b1a0a3f441f25e7ead23d127e4993aa60a..4622a18185233825ade24d4417a30d4409813341 100644 (file)
@@ -39,7 +39,7 @@ func main() {
                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
index 08b35be4f8423737a4020c07b70bf76f1721ff6c..99ce36b0d3f74b55bd048316226cb32e567873d2 100644 (file)
--- a/config.go
+++ b/config.go
@@ -23,6 +23,7 @@ var DefaultHTTPClient = &http.Client{
                TLSClientConfig:     &tls.Config{InsecureSkipVerify: true},
        },
 }
+var DefaultHTTPUserAgent = "Go-Torrent/1.0"
 
 // Override Client defaults.
 type Config struct {
@@ -78,6 +79,8 @@ type Config struct {
 
        // 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`.
@@ -104,6 +107,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"
        }
index b0ab3f95bee9f7985842992da703456d05aaaa64..6767a6725217f4ba72f5b3e47e18f1dde32dc8cd 100644 (file)
@@ -73,10 +73,11 @@ func setAnnounceParams(_url *url.URL, ar *AnnounceRequest) {
        _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 {
index e081f63917b62bb0e7a261b8b20e5d45ae6fa58b..d658d62c218990fbff12dfa9942a63ebf3a411f6 100644 (file)
@@ -9,6 +9,8 @@ import (
        "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"+
index 4ed76f11f4115ccb39965171fc2aecf33c7b2740..a2176f51ca3dd94a86aea6b4b5d4135a44821a69 100644 (file)
@@ -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:
index bf397e9d0af90231594a637b7be08a1e94b9c5a5..24157ec6e017ee77f2259984effc928ecf4a596f 100644 (file)
@@ -21,7 +21,7 @@ var defaultClient = &http.Client{
 
 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)
        }
index 78434d328dd73e40d19ffbf4f54242920f3b3da7..61ff8c5848287c732aac193b392b51c1cf37fa11 100644 (file)
@@ -114,7 +114,7 @@ func TestAnnounceLocalhost(t *testing.T) {
        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 @@ func TestUDPTracker(t *testing.T) {
        }
        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 @@ func TestAnnounceRandomInfoHashThirdParty(t *testing.T) {
                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 @@ func TestURLPathOption(t *testing.T) {
        }
        defer conn.Close()
        go func() {
-               _, err := Announce(defaultClient, (&url.URL{
+               _, err := Announce(defaultClient, defaultHTTPUserAgent, (&url.URL{
                        Scheme: "udp",
                        Host:   conn.LocalAddr().String(),
                        Path:   "/announce",
index a090bc1d7603a7b57b1315d76a5135404a01f84b..7434bdccda4cc58afeb53ea97c8a104aa12b0184 100644 (file)
@@ -85,7 +85,7 @@ func (me *trackerScraper) announce() (ret trackerAnnounceResult) {
        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