torckapi 0.0.23 → 0.0.24
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/torckapi/errors.rb +1 -0
- data/lib/torckapi/tracker/base.rb +1 -1
- data/lib/torckapi/tracker/http.rb +3 -3
- data/lib/torckapi/tracker/udp.rb +36 -15
- data/lib/torckapi/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 128514fdb065b8c1127accfd9d1f34faa850abbb
|
4
|
+
data.tar.gz: 9ec91b782fb80a643e27a29b59d23913cbf9c5ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 11251aa9696786eb80c58cd38e108de956363cceb110120e9b2df4f65cc7628645520088571f4c86aa446cfbc7b7f4f89588482c71841e9217279480a2de4c80
|
7
|
+
data.tar.gz: 236b55602c853b01eb0882c0f6852559e9378dedb79c78658c4bc08f57e7004f0647442b947ceb5b7afe24e71c2663837ea09910a72043d6929aeab8e2b85eda
|
data/lib/torckapi/errors.rb
CHANGED
@@ -10,6 +10,7 @@ module Torckapi
|
|
10
10
|
CommunicationFailedError = Class.new(CommunicationError)
|
11
11
|
CommunicationTimeoutError = Class.new(CommunicationError)
|
12
12
|
MalformedResponseError = Class.new(Error)
|
13
|
+
LittleEndianResponseError = Class.new(MalformedResponseError)
|
13
14
|
TransactionIdMismatchError = Class.new(CommunicationError)
|
14
15
|
end
|
15
16
|
end
|
@@ -7,13 +7,13 @@ module Torckapi
|
|
7
7
|
class HTTP < Base
|
8
8
|
# (see Base#announce)
|
9
9
|
def announce info_hash
|
10
|
-
super
|
10
|
+
super
|
11
11
|
Torckapi::Response::Announce.from_http(info_hash, perform_request(url_for(@url.dup, Announce, info_hash)))
|
12
12
|
end
|
13
13
|
|
14
14
|
# (see Base#scrape)
|
15
15
|
def scrape info_hashes=[]
|
16
|
-
super
|
16
|
+
super
|
17
17
|
Torckapi::Response::Scrape.from_http(perform_request(url_for(@url.dup, Scrape, info_hashes)))
|
18
18
|
end
|
19
19
|
|
@@ -22,7 +22,7 @@ module Torckapi
|
|
22
22
|
REQUEST_ACTIONS = [Announce = 1, Scrape = 2].freeze
|
23
23
|
|
24
24
|
def initialize url, options={}
|
25
|
-
super
|
25
|
+
super
|
26
26
|
@url.query ||= ""
|
27
27
|
end
|
28
28
|
|
data/lib/torckapi/tracker/udp.rb
CHANGED
@@ -8,12 +8,12 @@ module Torckapi
|
|
8
8
|
# Implementation of http://www.bittorrent.org/beps/bep_0015.html
|
9
9
|
class UDP < Base
|
10
10
|
def announce info_hash, peer_id=SecureRandom.random_bytes(20)
|
11
|
-
super
|
11
|
+
super
|
12
12
|
perform_request Announce, announce_request_data(info_hash, peer_id), info_hash
|
13
13
|
end
|
14
14
|
|
15
15
|
def scrape info_hashes=[]
|
16
|
-
super
|
16
|
+
super
|
17
17
|
perform_request Scrape, scrape_request_data(info_hashes), info_hashes
|
18
18
|
end
|
19
19
|
|
@@ -23,12 +23,27 @@ module Torckapi
|
|
23
23
|
REQUEST_ACTIONS = [Connect = 0, Announce = 1, Scrape = 2].freeze
|
24
24
|
RESPONSE_CLASSES = [nil, Torckapi::Response::Announce, Torckapi::Response::Scrape, Torckapi::Response::Error].freeze
|
25
25
|
RESPONSE_MIN_LENGTHS = [16, 20, 8, 8].freeze
|
26
|
+
RESPONSE_CODES = 0..RESPONSE_CLASSES.length
|
27
|
+
|
28
|
+
def initialize url, options={}
|
29
|
+
super
|
30
|
+
@state = nil
|
31
|
+
@connection_id = nil
|
32
|
+
@communicated_at = 0
|
33
|
+
end
|
34
|
+
|
35
|
+
def connected?
|
36
|
+
@connection_id && @communicated_at.to_i >= Time.now.to_i - CONNECTION_TIMEOUT
|
37
|
+
end
|
38
|
+
|
39
|
+
def connecting?
|
40
|
+
@state == :connecting
|
41
|
+
end
|
26
42
|
|
27
43
|
def perform_request action, data, *args
|
28
|
-
connect
|
29
44
|
response = communicate action, data
|
30
45
|
|
31
|
-
RESPONSE_CLASSES[response[:
|
46
|
+
RESPONSE_CLASSES[response[:code]].from_udp(*args, response[:data])
|
32
47
|
end
|
33
48
|
|
34
49
|
def announce_request_data info_hash, peer_id
|
@@ -40,29 +55,31 @@ module Torckapi
|
|
40
55
|
end
|
41
56
|
|
42
57
|
def connect
|
43
|
-
return if
|
58
|
+
return if connected? || connecting?
|
44
59
|
|
45
|
-
@connection_id = [0x041727101980].pack('Q>')
|
60
|
+
@state, @connection_id = :connecting, [0x041727101980].pack('Q>')
|
46
61
|
response = communicate Connect
|
47
|
-
@connection_id = response[:data]
|
62
|
+
@state, @connection_id = nil, response[:data]
|
48
63
|
end
|
49
64
|
|
50
65
|
def communicate action, data=nil
|
51
66
|
@socket ||= UDPSocket.new
|
52
67
|
|
53
|
-
transaction_id = SecureRandom.random_bytes(4)
|
54
68
|
tries = 0
|
55
69
|
response = nil
|
56
70
|
|
57
71
|
begin
|
72
|
+
timeout = @options[:timeout] * (2 ** tries)
|
73
|
+
connect
|
74
|
+
transaction_id = SecureRandom.random_bytes(4)
|
58
75
|
packet = [@connection_id, [action].pack('L>'), transaction_id, data].join
|
59
76
|
|
60
|
-
Timeout::timeout(
|
77
|
+
Timeout::timeout(timeout, CommunicationTimeoutError) do
|
61
78
|
@socket.send(packet, 0, @url.host, @url.port)
|
62
79
|
response = parse_response @socket.recvfrom(65536), transaction_id
|
63
80
|
@communicated_at = Time.now
|
64
81
|
end
|
65
|
-
rescue CommunicationTimeoutError
|
82
|
+
rescue CommunicationTimeoutError, LittleEndianResponseError => e
|
66
83
|
retry if (tries += 1) <= @options[:tries]
|
67
84
|
end
|
68
85
|
|
@@ -72,14 +89,18 @@ module Torckapi
|
|
72
89
|
end
|
73
90
|
|
74
91
|
def parse_response data, transaction_id
|
75
|
-
response
|
76
|
-
|
77
|
-
response_type = response[0..3].unpack('L>')[0]
|
92
|
+
response = data[0]
|
78
93
|
|
79
94
|
raise TransactionIdMismatchError, response.inspect if transaction_id != response[4..7]
|
80
|
-
raise MalformedResponseError, response.inspect if RESPONSE_MIN_LENGTHS[response_type] > response.length
|
81
95
|
|
82
|
-
|
96
|
+
response_code, response_code_le = response[0..3].unpack('L>')[0], response[0..3].unpack('L<')[0]
|
97
|
+
|
98
|
+
unless RESPONSE_CODES.include?(response_code)
|
99
|
+
raise (RESPONSE_CODES.include?(response_code_le) ? LittleEndianResponseError : MalformedResponseError), response.inspect
|
100
|
+
end
|
101
|
+
raise MalformedResponseError, response.inspect if RESPONSE_MIN_LENGTHS[response_code] > response.length
|
102
|
+
|
103
|
+
{code: response_code, data: response[8..-1]}
|
83
104
|
end
|
84
105
|
end
|
85
106
|
end
|
data/lib/torckapi/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: torckapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dennis Krupenik
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|