ret.Peers, err = trackerResponse.UnmarshalPeers()
return
}
-
-func (c *httpClient) Connect() error {
- // HTTP trackers do not require a connecting handshake.
- return nil
-}
-
-func (c *httpClient) String() string {
- return c.URL()
-}
-
-func (c *httpClient) URL() string {
- return c.url.String()
-}
)
type client interface {
- // Returns ErrNotConnected if Connect needs to be called.
Announce(*AnnounceRequest) (AnnounceResponse, error)
- Connect() error
- String() string
- URL() string
Close() error
}
var (
- ErrNotConnected = errors.New("not connected")
- ErrBadScheme = errors.New("unknown scheme")
+ ErrBadScheme = errors.New("unknown scheme")
schemes = make(map[string]func(*url.URL) client)
)
}
// Returns ErrBadScheme if the tracker scheme isn't recognised.
-func new(rawurl string) (cl client, err error) {
+func newClient(rawurl string) (cl client, err error) {
url_s, err := url.Parse(rawurl)
if err != nil {
return
}
func Announce(urlStr string, req *AnnounceRequest) (res AnnounceResponse, err error) {
- cl, err := new(urlStr)
+ cl, err := newClient(urlStr)
if err != nil {
return
}
defer cl.Close()
- err = cl.Connect()
- if err != nil {
- return
- }
return cl.Announce(req)
}
return nil
}
-func (c *udpClient) URL() string {
- return c.url.String()
-}
-
-func (c *udpClient) String() string {
- return c.URL()
-}
-
func (c *udpClient) Announce(req *AnnounceRequest) (res AnnounceResponse, err error) {
- if !c.connected() {
- err = ErrNotConnected
+ err = c.connect()
+ if err != nil {
return
}
reqURI := c.url.RequestURI()
return !c.connectionIdReceived.IsZero() && time.Now().Before(c.connectionIdReceived.Add(time.Minute))
}
-func (c *udpClient) Connect() (err error) {
+func (c *udpClient) connect() (err error) {
if c.connected() {
return nil
}