From d7d667bfc3732271d6b398336ea38996258e1291 Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 06:05:49 +0300 Subject: [PATCH 01/47] Wrong module --- lib/torckapi.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi.rb b/lib/torckapi.rb index 670d306..5e4d909 100644 --- a/lib/torckapi.rb +++ b/lib/torckapi.rb @@ -21,7 +21,7 @@ def self.tracker tracker_url, options={} when "udp" Torckapi::Tracker::UDP.new url, options else - raise InvalidSchemeError, "'#{tracker_url}' cannot be recognized as valid tracker url" + raise Torckapi::Tracker::InvalidSchemeError, "'#{tracker_url}' cannot be recognized as valid tracker url" end end end From f1243c565f79444f23546fbf877ec8bc0e6a36a2 Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 07:01:07 +0300 Subject: [PATCH 02/47] some tests --- .rspec | 2 ++ spec/spec_helper.rb | 20 ++++++++++++++++++++ spec/torckapi_spec.rb | 26 ++++++++++++++++++++++++++ torckapi.gemspec | 1 + 4 files changed, 49 insertions(+) create mode 100644 .rspec create mode 100644 spec/spec_helper.rb create mode 100644 spec/torckapi_spec.rb diff --git a/.rspec b/.rspec new file mode 100644 index 0000000..f2c1cec --- /dev/null +++ b/.rspec @@ -0,0 +1,2 @@ +-c +-fd diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb new file mode 100644 index 0000000..4777a2c --- /dev/null +++ b/spec/spec_helper.rb @@ -0,0 +1,20 @@ +require 'torckapi' + +RSpec.configure do |config| + def fixture(filename) + File.dirname(__FILE__) + '/fixtures/' + filename + end + + def make_response(xml_filename_or_string) + if xml_filename_or_string !~ /15, :tries=>7}) + end + + it "should not allow any protocols except HTTP or UDP" do + expect { Torckapi.tracker("https://xxx.com/") }.to raise_error(Torckapi::Tracker::InvalidSchemeError) + end + end + +end diff --git a/torckapi.gemspec b/torckapi.gemspec index 565178d..845282e 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -19,6 +19,7 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 0' gem.add_development_dependency 'minitest', '~> 0' + gem.add_development_dependency "rspec", "~> 3.2" gem.add_runtime_dependency 'bencode', '~> 0' end From 80139dd530664bf5a8766037143d1b795f830ba9 Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 07:46:16 +0300 Subject: [PATCH 03/47] travis config --- .travis.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..491c242 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +rvm: + - 1.9.3 + - 2.0.0 + - 2.1.7 + - 2.2.1 + - 2.2.3 From 44bfd9ee27402a4fd88f1a9328ef7602c4cfa6db Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:07:41 +0300 Subject: [PATCH 04/47] adding rake --- torckapi.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/torckapi.gemspec b/torckapi.gemspec index 845282e..e0605f9 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -20,6 +20,7 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 0' gem.add_development_dependency 'minitest', '~> 0' gem.add_development_dependency "rspec", "~> 3.2" + gem.add_development_dependency('rake') gem.add_runtime_dependency 'bencode', '~> 0' end From 25ca6bc1f4d9d275afb2f757f1b94101affadfd1 Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:11:23 +0300 Subject: [PATCH 05/47] gemspec --- Gemfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Gemfile b/Gemfile index 0fc559f..dd8d524 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,4 @@ source 'https://rubygems.org' gem 'bencode' +gemspec From 6aa718bf58fa2522a3aa116e5b7a554c4bd174cc Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:15:34 +0300 Subject: [PATCH 06/47] gemspec --- torckapi.gemspec | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index e0605f9..5341068 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -17,10 +17,11 @@ Gem::Specification.new do |gem| gem.licenses = ["MIT"] + gem.add_dependency 'bencode', '~> 0' + gem.add_development_dependency 'rake', '~> 0' gem.add_development_dependency 'minitest', '~> 0' - gem.add_development_dependency "rspec", "~> 3.2" - gem.add_development_dependency('rake') + gem.add_development_dependency 'rspec', '~> 3.2' + gem.add_development_dependency 'rake' - gem.add_runtime_dependency 'bencode', '~> 0' end From cc2de1b3945ba2ed386adfeaef3879375deac5ac Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:23:45 +0300 Subject: [PATCH 07/47] some changes --- Gemfile | 1 - Gemfile.lock | 28 +++++++++++++++++++++++++++- torckapi.gemspec | 2 -- 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Gemfile b/Gemfile index dd8d524..fa75df1 100644 --- a/Gemfile +++ b/Gemfile @@ -1,4 +1,3 @@ source 'https://rubygems.org' -gem 'bencode' gemspec diff --git a/Gemfile.lock b/Gemfile.lock index 78d3c43..f6d333e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,36 @@ +PATH + remote: . + specs: + torckapi (0.0.24) + bencode (~> 0) + GEM remote: https://rubygems.org/ specs: bencode (0.8.0) + diff-lcs (1.2.5) + rake (0.9.6) + rspec (3.3.0) + rspec-core (~> 3.3.0) + rspec-expectations (~> 3.3.0) + rspec-mocks (~> 3.3.0) + rspec-core (3.3.2) + rspec-support (~> 3.3.0) + rspec-expectations (3.3.1) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.3.0) + rspec-mocks (3.3.2) + diff-lcs (>= 1.2.0, < 2.0) + rspec-support (~> 3.3.0) + rspec-support (3.3.0) PLATFORMS ruby DEPENDENCIES - bencode + rake (~> 0) + rspec (~> 3.2) + torckapi! + +BUNDLED WITH + 1.10.6 diff --git a/torckapi.gemspec b/torckapi.gemspec index 5341068..b81f4e5 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -20,8 +20,6 @@ Gem::Specification.new do |gem| gem.add_dependency 'bencode', '~> 0' gem.add_development_dependency 'rake', '~> 0' - gem.add_development_dependency 'minitest', '~> 0' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency 'rake' end From 391de425e6d1a501600f4b83dac7c59c2c0db3ff Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:27:09 +0300 Subject: [PATCH 08/47] rakefile added --- Rakefile | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 Rakefile diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..61a6f66 --- /dev/null +++ b/Rakefile @@ -0,0 +1,11 @@ +#!/usr/bin/env rake +require 'rake' +require "bundler/gem_tasks" + +require 'rspec/core' +require 'rspec/core/rake_task' +RSpec::Core::RakeTask.new(:spec) do |spec| + spec.pattern = FileList['spec/**/*_spec.rb'] +end + +task :default => :spec From eec9b4126ea2e275ae0c9b274402bc6fdef48c0b Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:36:18 +0300 Subject: [PATCH 09/47] remove Gemfile.lock --- Gemfile.lock | 36 ------------------------------------ 1 file changed, 36 deletions(-) delete mode 100644 Gemfile.lock diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index f6d333e..0000000 --- a/Gemfile.lock +++ /dev/null @@ -1,36 +0,0 @@ -PATH - remote: . - specs: - torckapi (0.0.24) - bencode (~> 0) - -GEM - remote: https://rubygems.org/ - specs: - bencode (0.8.0) - diff-lcs (1.2.5) - rake (0.9.6) - rspec (3.3.0) - rspec-core (~> 3.3.0) - rspec-expectations (~> 3.3.0) - rspec-mocks (~> 3.3.0) - rspec-core (3.3.2) - rspec-support (~> 3.3.0) - rspec-expectations (3.3.1) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-mocks (3.3.2) - diff-lcs (>= 1.2.0, < 2.0) - rspec-support (~> 3.3.0) - rspec-support (3.3.0) - -PLATFORMS - ruby - -DEPENDENCIES - rake (~> 0) - rspec (~> 3.2) - torckapi! - -BUNDLED WITH - 1.10.6 From 115e5cf24b83773512836028192e1de3c969383b Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 09:56:11 +0300 Subject: [PATCH 10/47] codeclimate-test-reporter --- .gitignore | 2 +- .travis.yml | 3 +++ spec/spec_helper.rb | 3 +++ torckapi.gemspec | 1 + 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 769663d..8421bac 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,3 @@ .yardoc doc - +Gemfile.lock diff --git a/.travis.yml b/.travis.yml index 491c242..7c61db6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,3 +4,6 @@ rvm: - 2.1.7 - 2.2.1 - 2.2.3 +addons: + code_climate: + repo_token: 3004a7854020df72de40cef4c1f7fc1992ca1969b5420f548df7f4ab6a9b881b diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 4777a2c..2224c1a 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,8 @@ require 'torckapi' +require "codeclimate-test-reporter" +CodeClimate::TestReporter.start + RSpec.configure do |config| def fixture(filename) File.dirname(__FILE__) + '/fixtures/' + filename diff --git a/torckapi.gemspec b/torckapi.gemspec index b81f4e5..886c944 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,5 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 0' gem.add_development_dependency 'rspec', '~> 3.2' + gem.add_development_dependency 'codeclimate-test-reporter' end From 3ba70657831cb9696d37756813619fef5b2e8ba7 Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 10:03:53 +0300 Subject: [PATCH 11/47] env tocken codeclimate --- spec/spec_helper.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 2224c1a..803b02f 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,6 +1,7 @@ require 'torckapi' require "codeclimate-test-reporter" +ENV['CODECLIMATE_REPO_TOKEN'] = "3004a7854020df72de40cef4c1f7fc1992ca1969b5420f548df7f4ab6a9b881b" CodeClimate::TestReporter.start RSpec.configure do |config| From 0a2ac97171861671157647548dc1c23f471659ae Mon Sep 17 00:00:00 2001 From: 1v Date: Sun, 18 Oct 2015 10:34:15 +0300 Subject: [PATCH 12/47] codeclimate-test-reporter fix --- .gitignore | 1 + spec/spec_helper.rb | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 8421bac..4279ce2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .yardoc doc Gemfile.lock +coverage diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 803b02f..6d369a9 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,9 +1,8 @@ -require 'torckapi' - require "codeclimate-test-reporter" -ENV['CODECLIMATE_REPO_TOKEN'] = "3004a7854020df72de40cef4c1f7fc1992ca1969b5420f548df7f4ab6a9b881b" CodeClimate::TestReporter.start +require 'torckapi' + RSpec.configure do |config| def fixture(filename) File.dirname(__FILE__) + '/fixtures/' + filename From 6804a430fafb81f32b9e40945b1781e15c40dbef Mon Sep 17 00:00:00 2001 From: 1v Date: Thu, 22 Oct 2015 06:03:33 +0300 Subject: [PATCH 13/47] implement actual timeout and tries for HTTP --- lib/torckapi/tracker/http.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/torckapi/tracker/http.rb b/lib/torckapi/tracker/http.rb index 856376f..dcca289 100644 --- a/lib/torckapi/tracker/http.rb +++ b/lib/torckapi/tracker/http.rb @@ -33,10 +33,21 @@ def url_for url, action, data end def perform_request url + + tries = 0 + begin - Net::HTTP.get(url) - rescue Errno::ECONNRESET, Errno::ETIMEDOUT, Timeout::Error - raise CommunicationFailedError + timeout = @options[:timeout] + request = Net::HTTP::Get.new(url) + Net::HTTP.start(url.host, url.port, open_timeout: timeout, read_timeout: timeout) do |http| + http.request(request).body + end + rescue Errno::ECONNRESET, Errno::ETIMEDOUT, Timeout::Error, Errno::ECONNREFUSED + if (tries += 1) <= @options[:tries] + retry # backs up to just after the "begin" + else + raise CommunicationFailedError + end end end From 6e747276003124499bb3c68b86eb40c33963c9e5 Mon Sep 17 00:00:00 2001 From: 1v Date: Thu, 22 Oct 2015 06:15:19 +0300 Subject: [PATCH 14/47] guardfile added --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 4279ce2..6a2bce8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ doc Gemfile.lock coverage +Guardfile \ No newline at end of file From 07a8ae71672d2aa934ced8ace42b7bd2ea86bf84 Mon Sep 17 00:00:00 2001 From: 1v Date: Thu, 22 Oct 2015 06:18:33 +0300 Subject: [PATCH 15/47] low down number of tries --- lib/torckapi/tracker/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi/tracker/base.rb b/lib/torckapi/tracker/base.rb index d44bed8..eb8dd18 100644 --- a/lib/torckapi/tracker/base.rb +++ b/lib/torckapi/tracker/base.rb @@ -30,7 +30,7 @@ def scrape info_hashes=[] def initialize url, options={} @url = url - @options = {timeout: 15, tries: 7}.merge(options) + @options = {timeout: 15, tries: 2}.merge(options) end end end From 762e843bdd16a5a467e1d9e9db5e1249e021678e Mon Sep 17 00:00:00 2001 From: Artem Date: Thu, 22 Oct 2015 06:29:31 +0300 Subject: [PATCH 16/47] formatting --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 54a1462..4851ae6 100644 --- a/README.md +++ b/README.md @@ -26,14 +26,17 @@ tracker.announce("0123456789ABCDEF0123456789ABCDEF01234567") # @seeders=1, # @peers=[["127.0.0.1", 54078], ["127.0.0.2", 43666]]> -tracker.scrape(["0123456789ABCDEF0123456789ABCDEF01234567", "123456789ABCDEF0123456789ABCDEF012345678"]) +tracker.scrape(["0123456789ABCDEF0123456789ABCDEF01234567", + "123456789ABCDEF0123456789ABCDEF012345678"]) # => #{:seeders=>3, :completed=>0, :leechers=>13}, -# "123456789ABCDEF0123456789ABCDEF012345678"=>{:seeders=>4, :completed=>10, :leechers=>8}}> +# @data={"0123456789ABCDEF0123456789ABCDEF01234567"=>{:seeders=>3, +# :completed=>0, +# :leechers=>13}, +# "123456789ABCDEF0123456789ABCDEF012345678"=>{:seeders=>4, +# :completed=>10, +# :leechers=>8}}> ``` ## TODO - -Add tests. - -Document everything. +* Add tests. +* Document everything. From 95b95e2e932049710ee6b1d4b9a4f4a6bb3942a9 Mon Sep 17 00:00:00 2001 From: 1v Date: Thu, 22 Oct 2015 06:32:35 +0300 Subject: [PATCH 17/47] cut off strange timeouts; refactor retries --- lib/torckapi/tracker/udp.rb | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/torckapi/tracker/udp.rb b/lib/torckapi/tracker/udp.rb index 8a0ad2d..8de9575 100644 --- a/lib/torckapi/tracker/udp.rb +++ b/lib/torckapi/tracker/udp.rb @@ -69,23 +69,23 @@ def communicate action, data=nil response = nil begin - timeout = @options[:timeout] * (2 ** tries) connect transaction_id = SecureRandom.random_bytes(4) packet = [@connection_id, [action].pack('L>'), transaction_id, data].join - Timeout::timeout(timeout, CommunicationTimeoutError) do + Timeout::timeout(@options[:timeout], CommunicationTimeoutError) do @socket.send(packet, 0, @url.host, @url.port) response = process_response @socket.recvfrom(65536)[0], transaction_id @communicated_at = Time.now end + response rescue CommunicationTimeoutError, LittleEndianResponseError => e - retry if (tries += 1) <= @options[:tries] + if (tries += 1) <= @options[:tries] + retry + else + raise CommunicationFailedError + end end - - raise CommunicationFailedError unless response - - response end def process_response response, transaction_id From 7cde4a31741e6b8cc486fc71542b6dc03a9402ff Mon Sep 17 00:00:00 2001 From: 1v Date: Thu, 22 Oct 2015 07:08:36 +0300 Subject: [PATCH 18/47] fixtures refactoring --- spec/spec_helper.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6d369a9..de751a3 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -8,12 +8,12 @@ def fixture(filename) File.dirname(__FILE__) + '/fixtures/' + filename end - def make_response(xml_filename_or_string) - if xml_filename_or_string !~ / Date: Wed, 28 Oct 2015 13:32:35 +0300 Subject: [PATCH 19/47] adding tests and fixtures --- ...e14acedb90630243a950bd7aa204943eeca429.txt | Bin 0 -> 398 bytes ...afca487f6358eaf87b0ac6d1ae215c58ec3b83.txt | Bin 0 -> 1220 bytes spec/spec_helper.rb | 8 +-- spec/torckapi_spec.rb | 58 +++++++++++++++++- 4 files changed, 58 insertions(+), 8 deletions(-) create mode 100644 spec/fixtures/a1e14acedb90630243a950bd7aa204943eeca429.txt create mode 100644 spec/fixtures/ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt diff --git a/spec/fixtures/a1e14acedb90630243a950bd7aa204943eeca429.txt b/spec/fixtures/a1e14acedb90630243a950bd7aa204943eeca429.txt new file mode 100644 index 0000000000000000000000000000000000000000..2bb9ecf4c6bfefcb15e8c90d3d1f466d33e43e7f GIT binary patch literal 398 zcmYeXuu9I)EyzhNNzJq{HcmA(uu91<&&$bAOi4}2G&BGSWahz@7#XKp0Qn`UMP-RO znTF;Drm2QTR=JsZ3UEOSQ=?Q}Dg?}%IL^DSNKVfDkMtZtpzWfij%=j5$t?(brcp0m4o&;Gz=d)3}V=`GvO9=mfx z-5+K@lRU9{!?)+6Yb+Q}9SeA!+4j*yb@zf*W%u{p4cW4rA?Lb>*5|h5^rKUx9){R2 z+;;h4h@{Y>hPl#{Pjx$RU(FFd^|@!!*QQRXhw<_(8vjK?k9PdZI_?_i$66_UYLC$) n_tkM4dNQ+;B5yoZN_rI8?__#V#&g-*^8p{7pJ}>Jn4Ag#hN-ok literal 0 HcmV?d00001 diff --git a/spec/fixtures/ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt b/spec/fixtures/ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt new file mode 100644 index 0000000000000000000000000000000000000000..065cd5cb7cdcf1580253ecbcf8050e47cb4d59bf GIT binary patch literal 1220 zcmV;#1Uvfx0003U8~tzq00$ZX028hN031vLGxT#a!E%i^b}lw{?~)&|Dz>%^=axGz zumB&8hg=roK5de9-g{^o;j*E7NE+eG*K~?h9Y+xtsesx#tyMVljBc(Cn|u>_HY{A8 zKHTre++IgRzm+xTp?Dl!4T4ldj&UixPI)#qwHo0umCqnj?`?v-Cuco!@$|K2ekx6P54!7m#zNJs*3Kc!XY)$Cv!r-n1*Y`DKrH7Ju;bUjK`K>J=wUS zue|pI$yF*%!Tp=Pd{22d3o&G0xs-8F({qJbaYy%gHd98|Kv61Ydr68#z0-dw+@NU zqfGf$VSC_jOm&TLZ9{9czm2QdY7WVRb+B&^&7CkYwHpNwD@hBliM*onrYZgg$dafo zwj8U{lH7IYw82t;?+6T%6Mx=O0KXuN?cK+h5XHNZr}tUi==ra1H-6g|U6ql|T7u;%*6IOH=*@68!5)n<1O^nrO(E z3dq%2a^=~oTSG*VLop$-g2W>=Jxos}jGzF}sQ95svUijNV|rj^u7ne{>|E-YaWV?g z#RjR*HoQ~#tLIU=%kC)PPgZe42f|=f628?Z`oOcj8N9ahjBzyt2 zJMmRks{Fv;i&dv{Tz^~zQTWRHvv?geJevh}TnCas`cW%uFovk#R7XpcYqhKK3chPn zb=;_M3Ab15Ib0NSY~NtOMozkt#d%9EYbP&J1DqmK;44Q{A;I06Rv$M&P43aOziG-E z;bRF`7gcgT!X4(q+&uCZ+^QA@Mq&6XQmkS_1<7HXkCD3Qqm70?(a6Mo|d-fuz}iYgFGxKWKsDAL{7 z@xhZ$vQ}dsqGRAkGO(RchuG6)ad@L>`TjKgtyY|Vo04Bdy26l2LjqLrd~;`Fo6{0_ zfls$ROqKT}NC2wnJr1d1A6Cv7*Gu4=1z(TGFF5{F3-w@g^HPzWSDl5gYcMCvyk%mF zj)#&d-=R%AXTH_PsA){D6jx!is6|*P+Rw<`{iw=2&x^xvce0OqIt=KEq+C*LBSN+< zGUY4yPARET#44o4|L`tV{YfjtM^Xc7L|NmM)l~WtiB>cuOv4Z2FNBj^;PZ@C^#)3f iOWRuVU@+RtSHT7=y-WiD-iz4Ffq)D15, :tries=>7}) + expect(@http_tracker.instance_variable_get(:@options)).to \ + eql({:timeout=>15, :tries=>2}) end it "should not allow any protocols except HTTP or UDP" do - expect { Torckapi.tracker("https://xxx.com/") }.to raise_error(Torckapi::Tracker::InvalidSchemeError) + expect { Torckapi.tracker("https://xxx.com/") }.to \ + raise_error(Torckapi::Tracker::InvalidSchemeError) + end + end + + describe "#announce" do + it "method should exist" do + expect(@http_tracker).to respond_to(:announce) + end + + it "require at least one argument" do + expect { @http_tracker.announce }.to raise_error(ArgumentError) + end + + context "should recieve response from" do + it "http" do + test_hash = "a1e14acedb90630243a950bd7aa204943eeca429" + # File.write('spec/fixtures/a1e1...eca429.txt', "d8:completei833e10") + http = double + allow(Net::HTTP).to receive(:start).and_yield http + allow(Net::HTTPResponse).to receive(:body) \ + .and_return(make_response(test_hash)) + + allow(http).to \ + receive(:request).with(an_instance_of(Net::HTTP::Get)) \ + .and_return(Net::HTTPResponse) + + tr = @http_tracker.announce(test_hash) + expect(tr.info_hash).to eql(test_hash) + expect(tr.leechers).to eql(23) + expect(tr.seeders).to eql(833) + end + + it "udp" do + test_hash = "ceafca487f6358eaf87b0ac6d1ae215c58ec3b83" + # File.open("spec/fixtures/ceaf...8ec3b83.txt", "w:UTF-8") do |f| + # f.write "" + # end + # File.write('spec/fixtures/ceafca...58ec3b83.txt', "", "w:UTF-8") + udp = double + allow(UDPSocket).to receive(:new).and_return udp + allow(udp).to receive(:send).and_return udp + allow(udp).to receive(:recvfrom).with(65536) \ + .and_return([make_response(test_hash).force_encoding("ASCII-8BIT")]) + + allow(SecureRandom).to receive(:random_bytes).with(20).and_call_original + allow(SecureRandom).to receive(:random_bytes).with(4) \ + .and_return("\x1D\e\xFDp".force_encoding("ASCII-8BIT")) + + tr = @udp_tracker.announce(test_hash) + expect(tr.info_hash).to eql(test_hash) + expect(tr.leechers).to eql(5038) + expect(tr.seeders).to eql(7244) + end end end From 13bbfcead3b197d8d9e45135bef8412d66e67e20 Mon Sep 17 00:00:00 2001 From: 1v Date: Mon, 2 Nov 2015 15:47:39 +0300 Subject: [PATCH 20/47] tests added; fixtures filenames changed --- ...7aa204943eeca429.txt => http_announce.txt} | Bin spec/fixtures/http_scrape.txt | 1 + ...6d1ae215c58ec3b83.txt => udp_announce.txt} | Bin spec/fixtures/udp_scrape.txt | Bin 0 -> 32 bytes spec/spec_helper.rb | 4 +- spec/torckapi_spec.rb | 119 ++++++++++++++---- 6 files changed, 100 insertions(+), 24 deletions(-) rename spec/fixtures/{a1e14acedb90630243a950bd7aa204943eeca429.txt => http_announce.txt} (100%) create mode 100644 spec/fixtures/http_scrape.txt rename spec/fixtures/{ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt => udp_announce.txt} (100%) create mode 100644 spec/fixtures/udp_scrape.txt diff --git a/spec/fixtures/a1e14acedb90630243a950bd7aa204943eeca429.txt b/spec/fixtures/http_announce.txt similarity index 100% rename from spec/fixtures/a1e14acedb90630243a950bd7aa204943eeca429.txt rename to spec/fixtures/http_announce.txt diff --git a/spec/fixtures/http_scrape.txt b/spec/fixtures/http_scrape.txt new file mode 100644 index 0000000..a2d3f01 --- /dev/null +++ b/spec/fixtures/http_scrape.txt @@ -0,0 +1 @@ +d5:filesd20:W?/-n2'T1,%d8:completei1893e10:downloadedi10e10:incompletei242ee20:⌮v{mS 6jd8:completei1768e10:downloadedi10e10:incompletei259eeee \ No newline at end of file diff --git a/spec/fixtures/ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt b/spec/fixtures/udp_announce.txt similarity index 100% rename from spec/fixtures/ceafca487f6358eaf87b0ac6d1ae215c58ec3b83.txt rename to spec/fixtures/udp_announce.txt diff --git a/spec/fixtures/udp_scrape.txt b/spec/fixtures/udp_scrape.txt new file mode 100644 index 0000000000000000000000000000000000000000..c5a087e4cea2351b8c85fdfd9400b286c4e4e618 GIT binary patch literal 32 jcmZQzU|?FWJ^d8}1A`P0F92dT1_nkS1_tgXAUh2JQ7;5u literal 0 HcmV?d00001 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6620b80..0a9fc43 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -13,7 +13,7 @@ def make_response(filename_or_string) end def init_torckapi - @http_tracker = Torckapi.tracker("http://xxx.com/") - @udp_tracker = Torckapi.tracker("udp://xxx.com/") + @http_tracker = Torckapi.tracker("http://localhost/") + @udp_tracker = Torckapi.tracker("udp://localhost/") end end diff --git a/spec/torckapi_spec.rb b/spec/torckapi_spec.rb index 953b77c..edfa1a5 100644 --- a/spec/torckapi_spec.rb +++ b/spec/torckapi_spec.rb @@ -2,7 +2,21 @@ describe Torckapi do - before { init_torckapi } + before do + init_torckapi + + http = double + allow(Net::HTTP).to receive(:start).and_yield http + allow(http).to \ + receive(:request).with(an_instance_of(Net::HTTP::Get)) \ + .and_return(Net::HTTPResponse) + + @udp = double + allow(UDPSocket).to receive(:new).and_return @udp + allow(@udp).to receive(:send).and_return @udp + + allow(SecureRandom).to receive(:random_bytes).and_call_original + end describe "#tracker" do it "method should exist" do @@ -20,7 +34,7 @@ end it "should not allow any protocols except HTTP or UDP" do - expect { Torckapi.tracker("https://xxx.com/") }.to \ + expect { Torckapi.tracker("https://localhost/") }.to \ raise_error(Torckapi::Tracker::InvalidSchemeError) end end @@ -28,45 +42,50 @@ describe "#announce" do it "method should exist" do expect(@http_tracker).to respond_to(:announce) + expect(@udp_tracker).to respond_to(:announce) end - it "require at least one argument" do - expect { @http_tracker.announce }.to raise_error(ArgumentError) + it "should decline not valid hashes" do + expect { + @http_tracker.announce(SecureRandom.hex(19)) + }.to raise_error(Torckapi::InvalidInfohashError) + expect { + @http_tracker.announce(SecureRandom.hex(21)) + }.to raise_error(Torckapi::InvalidInfohashError) + expect { + @udp_tracker.announce(SecureRandom.hex(19)) + }.to raise_error(Torckapi::InvalidInfohashError) + expect { + @udp_tracker.announce(SecureRandom.hex(21)) + }.to raise_error(Torckapi::InvalidInfohashError) end context "should recieve response from" do it "http" do - test_hash = "a1e14acedb90630243a950bd7aa204943eeca429" - # File.write('spec/fixtures/a1e1...eca429.txt', "d8:completei833e10") - http = double - allow(Net::HTTP).to receive(:start).and_yield http - allow(Net::HTTPResponse).to receive(:body) \ - .and_return(make_response(test_hash)) + test_hash = SecureRandom.hex(20) + # File.write('spec/fixtures/udp_scrape.txt', "") - allow(http).to \ - receive(:request).with(an_instance_of(Net::HTTP::Get)) \ - .and_return(Net::HTTPResponse) + allow(Net::HTTPResponse).to receive(:body) + .and_return(make_response("http_announce")) tr = @http_tracker.announce(test_hash) expect(tr.info_hash).to eql(test_hash) expect(tr.leechers).to eql(23) expect(tr.seeders).to eql(833) + end it "udp" do - test_hash = "ceafca487f6358eaf87b0ac6d1ae215c58ec3b83" + test_hash = SecureRandom.hex(20) # File.open("spec/fixtures/ceaf...8ec3b83.txt", "w:UTF-8") do |f| # f.write "" # end # File.write('spec/fixtures/ceafca...58ec3b83.txt', "", "w:UTF-8") - udp = double - allow(UDPSocket).to receive(:new).and_return udp - allow(udp).to receive(:send).and_return udp - allow(udp).to receive(:recvfrom).with(65536) \ - .and_return([make_response(test_hash).force_encoding("ASCII-8BIT")]) - - allow(SecureRandom).to receive(:random_bytes).with(20).and_call_original - allow(SecureRandom).to receive(:random_bytes).with(4) \ + + allow(@udp).to receive(:recvfrom).with(65536) + .and_return([make_response("udp_announce") + .force_encoding("ASCII-8BIT")]) + allow(SecureRandom).to receive(:random_bytes).with(4) .and_return("\x1D\e\xFDp".force_encoding("ASCII-8BIT")) tr = @udp_tracker.announce(test_hash) @@ -77,4 +96,60 @@ end end + describe "#scrape" do + it "method should exist" do + expect(@http_tracker).to respond_to(:scrape) + expect(@udp_tracker).to respond_to(:scrape) + end + + it "should decline not valid hashes" do + expect { + @http_tracker.scrape([SecureRandom.hex(19), SecureRandom.hex(21)]) + }.to raise_error(Torckapi::InvalidInfohashError) + expect { + @udp_tracker.scrape([SecureRandom.hex(19), SecureRandom.hex(21)]) + }.to raise_error(Torckapi::InvalidInfohashError) + end + + context "should recieve response from" do + before do + @test_hash = ["573f1b2f2d11dcc06eaa9b322754312c15bb9b25", + "bce28cae76f27bb36d5380e7dc1090a109bd366a"] + end + + it "http" do + allow(Net::HTTPResponse).to receive(:body) \ + .and_return(make_response("http_scrape")) + + tr = @http_tracker.scrape(@test_hash) + expect(tr).to respond_to(:data) + + tr = tr.data + expect(tr).to have_key(@test_hash[0]) + expect(tr).to have_key(@test_hash[1]) + expect(tr[@test_hash[0]][:seeders]).to eql(1893) + expect(tr[@test_hash[0]][:leechers]).to eql(242) + expect(tr[@test_hash[0]][:completed]).to eql(10) + end + it "udp" do + allow(@udp).to receive(:recvfrom).with(65536) + .and_return([make_response("udp_scrape") + .force_encoding("ASCII-8BIT")]) + allow(SecureRandom).to receive(:random_bytes).with(4) + .and_return("\xAF+\x97\xEA".force_encoding("ASCII-8BIT")) + tr = @udp_tracker.scrape(@test_hash) + + expect(tr).to respond_to(:data) + + tr = tr.data + expect(tr).to have_key(@test_hash[0]) + expect(tr).to have_key(@test_hash[1]) + expect(tr[@test_hash[0]][:seeders]).to eql(26) + expect(tr[@test_hash[0]][:leechers]).to eql(6) + expect(tr[@test_hash[0]][:completed]).to eql(160) + + end + end + end + end From d2045d31f4f0678298281c641a9e40973b7c04d5 Mon Sep 17 00:00:00 2001 From: 1v Date: Mon, 2 Nov 2015 15:58:19 +0300 Subject: [PATCH 21/47] trying to fix 1.9.3 version error --- lib/torckapi/tracker/http.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi/tracker/http.rb b/lib/torckapi/tracker/http.rb index dcca289..b1ba29c 100644 --- a/lib/torckapi/tracker/http.rb +++ b/lib/torckapi/tracker/http.rb @@ -38,7 +38,7 @@ def perform_request url begin timeout = @options[:timeout] - request = Net::HTTP::Get.new(url) + request = Net::HTTP::Get.new(url.to_s) Net::HTTP.start(url.host, url.port, open_timeout: timeout, read_timeout: timeout) do |http| http.request(request).body end From 76fe51bfdd3e663861fb50f7b2743a5791bc489a Mon Sep 17 00:00:00 2001 From: 1v Date: Fri, 6 Nov 2015 18:55:53 +0300 Subject: [PATCH 22/47] adding parentheses according to https://github.com/bbatsov/ruby-style-guide#method-parens --- lib/torckapi.rb | 9 +++++---- lib/torckapi/response/announce.rb | 8 ++++---- lib/torckapi/response/base.rb | 2 +- lib/torckapi/response/error.rb | 4 ++-- lib/torckapi/response/scrape.rb | 12 ++++++------ lib/torckapi/tracker/base.rb | 6 +++--- lib/torckapi/tracker/http.rb | 12 ++++++------ lib/torckapi/tracker/udp.rb | 22 +++++++++++----------- 8 files changed, 38 insertions(+), 37 deletions(-) diff --git a/lib/torckapi.rb b/lib/torckapi.rb index 5e4d909..f42e489 100644 --- a/lib/torckapi.rb +++ b/lib/torckapi.rb @@ -12,16 +12,17 @@ module Torckapi # @param tracker_url [String] tracker announce url # @param options [Hash] defaults to \\{timeout: 15, tries: 3} # @return [Torckapi::Tracker::Base] tracker interface instance - def self.tracker tracker_url, options={} + def self.tracker(tracker_url, options = {}) url = URI.parse tracker_url case url.scheme when "http" - Torckapi::Tracker::HTTP.new url, options + Torckapi::Tracker::HTTP.new(url, options) when "udp" - Torckapi::Tracker::UDP.new url, options + Torckapi::Tracker::UDP.new(url, options) else - raise Torckapi::Tracker::InvalidSchemeError, "'#{tracker_url}' cannot be recognized as valid tracker url" + raise Torckapi::Tracker::InvalidSchemeError, \ + "'#{tracker_url}' cannot be recognized as valid tracker url" end end end diff --git a/lib/torckapi/response/announce.rb b/lib/torckapi/response/announce.rb index faeddb2..2158678 100644 --- a/lib/torckapi/response/announce.rb +++ b/lib/torckapi/response/announce.rb @@ -20,7 +20,7 @@ class Announce < Base # @param info_hash [String] 40-char hexadecimal string # @param data [String] UDP response data (omit action and transaction_id) # @return [Torckapi::Response::Announce] response - def self.from_udp info_hash, data + def self.from_udp(info_hash, data) new info_hash, *data[4..11].unpack('L>2'), peers_from_compact(data[12..-1] || '') end @@ -29,21 +29,21 @@ def self.from_udp info_hash, data # @param data [String] HTTP response data (bencoded) # @return [Torckapi::Response::Announce] response # @raise [Torckapi::Tracker::MalformedResponseError] - def self.from_http info_hash, data + def self.from_http(info_hash, data) bdecoded_data = bdecode_and_check data, 'peers' new info_hash, *bdecoded_data.values_at('incomplete', 'complete'), peers_from_compact(bdecoded_data['peers']) end private - def initialize info_hash, leechers, seeders, peers + def initialize(info_hash, leechers, seeders, peers) @info_hash = info_hash @leechers = leechers @seeders = seeders @peers = peers end - def self.peers_from_compact data + def self.peers_from_compact(data) # ipv4 address + tcp/udp port = 6 bytes data.unpack('a6' * (data.length / 6)).map { |i| [IPAddr.ntop(i[0..3]), i[4..5].unpack('S>')[0]] } end diff --git a/lib/torckapi/response/base.rb b/lib/torckapi/response/base.rb index 44a0965..08e98ea 100644 --- a/lib/torckapi/response/base.rb +++ b/lib/torckapi/response/base.rb @@ -5,7 +5,7 @@ module Response class Base protected - def self.bdecode_and_check data, key + def self.bdecode_and_check(data, key) begin bdecoded_data = BEncode.load(data) rescue BEncode::DecodeError diff --git a/lib/torckapi/response/error.rb b/lib/torckapi/response/error.rb index 549e16f..58f1099 100644 --- a/lib/torckapi/response/error.rb +++ b/lib/torckapi/response/error.rb @@ -16,7 +16,7 @@ class Error < Base # @param info_hashes [String, Array] a 40-char hexadecimal string or an array of those # @param data [String] UDP response data (omit action and transaction_id) # @return [Torckapi::Response::Error] response - def self.from_udp info_hashes, data + def self.from_udp(info_hashes, data) new(info_hashes, data || "") end @@ -26,7 +26,7 @@ def info_hash private - def initialize info_hashes, message + def initialize(info_hashes, message) @info_hashes = [*info_hashes] @message = message end diff --git a/lib/torckapi/response/scrape.rb b/lib/torckapi/response/scrape.rb index ab5e70b..9a043dd 100644 --- a/lib/torckapi/response/scrape.rb +++ b/lib/torckapi/response/scrape.rb @@ -12,7 +12,7 @@ class Scrape < Base # @param data [String] UDP response data (omit action and transaction_id) # @return [Torckapi::Response::Scrape] response # @raise [Torckapi::Tracker::MalformedResponseError] - def self.from_udp info_hashes, data + def self.from_udp(info_hashes, data) raise Torckapi::Tracker::MalformedResponseError if data.length != info_hashes.count * 12 new Hash[info_hashes.zip(data.unpack('a12' * info_hashes.count).map { |i| counts_unpacked(i) })] end @@ -21,26 +21,26 @@ def self.from_udp info_hashes, data # @param data [String] HTTP response data (bencoded) # @return [Torckapi::Response::Scrape] response # @raise [Torckapi::Tracker::MalformedResponseError] - def self.from_http data + def self.from_http(data) bdecoded_data = bdecode_and_check data, 'files' new Hash[bdecoded_data['files'].map { |info_hash, counts| [info_hash.unpack('H*').join, counts_translated(counts) ]}] end private - def self.counts_unpacked data + def self.counts_unpacked(data) counts_with_block(data) { |data| data.unpack('L>3').map(&:to_i) } end - def self.counts_translated data + def self.counts_translated(data) counts_with_block(data) { |data| data.values_at('complete', 'downloaded', 'incomplete') } end - def self.counts_with_block data, &block + def self.counts_with_block(data, &block) Hash[[:seeders, :completed, :leechers].zip(yield data)] end - def initialize data + def initialize(data) @data = data end end diff --git a/lib/torckapi/tracker/base.rb b/lib/torckapi/tracker/base.rb index eb8dd18..0a711e7 100644 --- a/lib/torckapi/tracker/base.rb +++ b/lib/torckapi/tracker/base.rb @@ -12,7 +12,7 @@ class Base # @raise [Torckapi::InvalidInfohashError] when supplied with invalid info_hash # @raise [Torckapi::Tracker::CommunicationFailedError] when tracker haven't responded at all # @raise [Torckapi::Tracker::MalformedResponseError] when tracker returned junk - def announce info_hash, peer_id=SecureRandom.random_bytes(20) + def announce(info_hash, peer_id = SecureRandom.random_bytes(20)) raise Torckapi::InvalidInfohashError if info_hash !~ /\A[0-9a-f]{40}\z/i end @@ -22,13 +22,13 @@ def announce info_hash, peer_id=SecureRandom.random_bytes(20) # @raise [Torckapi::InvalidInfohashError] when supplied with invalid info_hash # @raise [Torckapi::Tracker::CommunicationFailedError] when tracker haven't responded at all # @raise [Torckapi::Tracker::MalformedResponseError] when tracker returned junk - def scrape info_hashes=[] + def scrape(info_hashes = []) raise Torckapi::InvalidInfohashError if info_hashes.any? { |i| i !~ /\A[0-9a-f]{40}\z/i } end private - def initialize url, options={} + def initialize(url, options = {}) @url = url @options = {timeout: 15, tries: 2}.merge(options) end diff --git a/lib/torckapi/tracker/http.rb b/lib/torckapi/tracker/http.rb index b1ba29c..3a3c441 100644 --- a/lib/torckapi/tracker/http.rb +++ b/lib/torckapi/tracker/http.rb @@ -6,13 +6,13 @@ module Tracker class HTTP < Base # (see Base#announce) - def announce info_hash + def announce(info_hash) super Torckapi::Response::Announce.from_http(info_hash, perform_request(url_for(@url.dup, Announce, info_hash))) end # (see Base#scrape) - def scrape info_hashes=[] + def scrape(info_hashes = []) super Torckapi::Response::Scrape.from_http(perform_request(url_for(@url.dup, Scrape, info_hashes))) end @@ -21,18 +21,18 @@ def scrape info_hashes=[] REQUEST_ACTIONS = [Announce = 1, Scrape = 2].freeze - def initialize url, options={} + def initialize(url, options = {}) super @url.query ||= "" end - def url_for url, action, data + def url_for(url, action, data) url.query += info_hash_params [*data] url.path.gsub!(/announce/, 'scrape') if Scrape == action url end - def perform_request url + def perform_request(url) tries = 0 @@ -51,7 +51,7 @@ def perform_request url end end - def info_hash_params info_hashes + def info_hash_params(info_hashes) info_hashes.map { |i| "info_hash=%s" % URI.encode([i].pack('H*')) }.join('&') end end diff --git a/lib/torckapi/tracker/udp.rb b/lib/torckapi/tracker/udp.rb index 8de9575..6f2843d 100644 --- a/lib/torckapi/tracker/udp.rb +++ b/lib/torckapi/tracker/udp.rb @@ -7,12 +7,12 @@ module Torckapi module Tracker # Implementation of http://www.bittorrent.org/beps/bep_0015.html class UDP < Base - def announce info_hash, peer_id=SecureRandom.random_bytes(20) + def announce(info_hash, peer_id = SecureRandom.random_bytes(20)) super perform_request Announce, announce_request_data(info_hash, peer_id), info_hash end - def scrape info_hashes=[] + def scrape(info_hashes = []) super perform_request Scrape, scrape_request_data(info_hashes), info_hashes end @@ -25,7 +25,7 @@ def scrape info_hashes=[] RESPONSE_MIN_LENGTHS = [16, 20, 8, 8].freeze RESPONSE_CODES = 0..RESPONSE_CLASSES.length - def initialize url, options={} + def initialize(url, options = {}) super @state = nil @connection_id = nil @@ -40,17 +40,17 @@ def connecting? @state == :connecting end - def perform_request action, data, *args + def perform_request(action, data, *args) response = communicate action, data RESPONSE_CLASSES[response[:code]].from_udp(*args, response[:data]) end - def announce_request_data info_hash, peer_id + def announce_request_data(info_hash, peer_id) [[info_hash].pack('H*'), peer_id, [0, 0, 0, 0, 0, 0, -1, 0].pack('Q>3L>4S>')].join end - def scrape_request_data info_hashes + def scrape_request_data(info_hashes) info_hashes.map { |i| [i].pack('H*') }.join end @@ -62,7 +62,7 @@ def connect @state, @connection_id = nil, response[:data] end - def communicate action, data=nil + def communicate(action, data = nil) @socket ||= UDPSocket.new tries = 0 @@ -88,7 +88,7 @@ def communicate action, data=nil end end - def process_response response, transaction_id + def process_response(response, transaction_id) check_transaction_id response, transaction_id response_code = extract_response_code response check_response_length response, response_code @@ -96,11 +96,11 @@ def process_response response, transaction_id {code: response_code, data: response[8..-1]} end - def check_transaction_id response, transaction_id + def check_transaction_id(response, transaction_id) raise TransactionIdMismatchError, response if transaction_id != response[4..7] end - def extract_response_code response + def extract_response_code(response) response_code, response_code_le = [response[0..3]].flat_map { |x| [x.unpack('L>')[0], x.unpack('L<')[0]] } unless RESPONSE_CODES.include?(response_code) @@ -110,7 +110,7 @@ def extract_response_code response response_code end - def check_response_length response, response_code + def check_response_length(response, response_code) raise MalformedResponseError, response if RESPONSE_MIN_LENGTHS[response_code] > response.length end end From c5f9a268a111feb974e456ca838664e0427bd5e2 Mon Sep 17 00:00:00 2001 From: 1v Date: Sat, 7 Nov 2015 16:46:12 +0300 Subject: [PATCH 23/47] 1.9.3 again; using determination of ruby version --- lib/torckapi/tracker/http.rb | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/torckapi/tracker/http.rb b/lib/torckapi/tracker/http.rb index 3a3c441..9527ef3 100644 --- a/lib/torckapi/tracker/http.rb +++ b/lib/torckapi/tracker/http.rb @@ -38,7 +38,11 @@ def perform_request(url) begin timeout = @options[:timeout] - request = Net::HTTP::Get.new(url.to_s) + if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('1.9.3') + request = Net::HTTP::Get.new(url.to_s) + else + request = Net::HTTP::Get.new(url) + end Net::HTTP.start(url.host, url.port, open_timeout: timeout, read_timeout: timeout) do |http| http.request(request).body end From b2cf7dccb0685c4e7547f01f14057731c7daf556 Mon Sep 17 00:00:00 2001 From: 1v Date: Tue, 5 Jan 2016 16:40:15 +0300 Subject: [PATCH 24/47] messages for exceptions --- lib/torckapi/response/base.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/torckapi/response/base.rb b/lib/torckapi/response/base.rb index 08e98ea..50e4d43 100644 --- a/lib/torckapi/response/base.rb +++ b/lib/torckapi/response/base.rb @@ -9,10 +9,10 @@ def self.bdecode_and_check(data, key) begin bdecoded_data = BEncode.load(data) rescue BEncode::DecodeError - raise Torckapi::Tracker::MalformedResponseError + raise Torckapi::Tracker::MalformedResponseError, "Can't decode '%s'" % data end - raise Torckapi::Tracker::MalformedResponseError unless bdecoded_data.is_a? Hash and bdecoded_data.has_key? key + raise Torckapi::Tracker::MalformedResponseError, "bdecoded data: '%s'" % bdecoded_data + " didn't contain key: '%s'" % key unless bdecoded_data.is_a? Hash and bdecoded_data.has_key? key bdecoded_data end From f2758c3e5c8f33f9605a7c2a68589d769d4f209b Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 11 Oct 2016 12:19:34 +0300 Subject: [PATCH 25/47] Refactoring --- lib/torckapi/tracker/http.rb | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/torckapi/tracker/http.rb b/lib/torckapi/tracker/http.rb index 9527ef3..355bfac 100644 --- a/lib/torckapi/tracker/http.rb +++ b/lib/torckapi/tracker/http.rb @@ -38,11 +38,12 @@ def perform_request(url) begin timeout = @options[:timeout] - if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('1.9.3') - request = Net::HTTP::Get.new(url.to_s) - else - request = Net::HTTP::Get.new(url) - end + request_url = if Gem::Version.new(RUBY_VERSION) <= Gem::Version.new('1.9.3') + url.to_s + else + url + end + request = Net::HTTP::Get.new(request_url) Net::HTTP.start(url.host, url.port, open_timeout: timeout, read_timeout: timeout) do |http| http.request(request).body end From 01f733f7eff1086b70dd6728291b78abcaa4fe7a Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 11 Oct 2016 12:23:58 +0300 Subject: [PATCH 26/47] Adding license --- LICENSE.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE.md diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 0000000..fa020fc --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From ee11de2584e06ebdf75931af933e49136b417281 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Wed, 12 Oct 2016 15:27:02 +0300 Subject: [PATCH 27/47] New badges --- README.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4851ae6..0b76a6b 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,10 @@ # Torckapi — torrent tracker querying API [![Gem Version](https://img.shields.io/gem/v/torckapi.svg)](https://rubygems.org/gems/torckapi) -[![Dependencies Status](https://img.shields.io/gemnasium/krupenik/torckapi.svg)](https://gemnasium.com/krupenik/torckapi) -[![Code Climate](https://img.shields.io/codeclimate/github/krupenik/torckapi.svg)](https://codeclimate.com/github/krupenik/torckapi) +[![Dependency Status](https://gemnasium.com/badges/github.com/1v/torckapi.svg)](https://gemnasium.com/github.com/1v/torckapi) +[![Build Status](https://travis-ci.org/1v/torckapi.svg?branch=master)](https://travis-ci.org/1v/torckapi) +[![Code Climate](https://codeclimate.com/github/1v/torckapi/badges/gpa.svg)](https://codeclimate.com/github/1v/torckapi) +[![Test Coverage](https://codeclimate.com/github/1v/torckapi/badges/coverage.svg)](https://codeclimate.com/github/1v/torckapi/coverage) ## Description From fd3a96ae59d4be7476d93c2ed1b1a3e311a0c1fd Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Wed, 12 Oct 2016 16:43:06 +0300 Subject: [PATCH 28/47] Adding latest stable ruby --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 7c61db6..52ad245 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ rvm: - 2.1.7 - 2.2.1 - 2.2.3 + - 2.3.1 addons: code_climate: repo_token: 3004a7854020df72de40cef4c1f7fc1992ca1969b5420f548df7f4ab6a9b881b From f0f3edac8da61c2d475a000b1b2e8b0bd936356c Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Fri, 14 Oct 2016 18:27:19 +0300 Subject: [PATCH 29/47] Codeclimate fix for ruby 1.9.3 --- torckapi.gemspec | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index 886c944..bbc0478 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -22,5 +22,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake', '~> 0' gem.add_development_dependency 'rspec', '~> 3.2' gem.add_development_dependency 'codeclimate-test-reporter' - + # codeclimate fix for ruby 1.9.3 + gem.add_development_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" end From 73570dfd7d810b7b9d870f8f9238df49e46e8ef6 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Sat, 15 Oct 2016 13:29:22 +0300 Subject: [PATCH 30/47] Rake version --- torckapi.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index bbc0478..968831f 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -19,7 +19,7 @@ Gem::Specification.new do |gem| gem.add_dependency 'bencode', '~> 0' - gem.add_development_dependency 'rake', '~> 0' + gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' gem.add_development_dependency 'codeclimate-test-reporter' # codeclimate fix for ruby 1.9.3 From baebb545931bafbda8db661a54a9501d9ced1651 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Mon, 7 Nov 2016 11:40:40 +0300 Subject: [PATCH 31/47] Codeclimate fixed --- torckapi.gemspec | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index 968831f..1043da4 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,7 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency 'codeclimate-test-reporter' - # codeclimate fix for ruby 1.9.3 - gem.add_development_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" + gem.add_development_dependency 'simplecov' + gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From cfc253676bcf4edc3b192fc141b040c3371cf9b1 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Mon, 7 Nov 2016 11:41:12 +0300 Subject: [PATCH 32/47] Update spec_helper.rb --- spec/spec_helper.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 0a9fc43..8ad89ff 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,5 @@ -require "codeclimate-test-reporter" -CodeClimate::TestReporter.start +require "simplecov" +SimpleCov.start" require 'torckapi' From 6337e427621d634898c7ce51966087d932323652 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Mon, 7 Nov 2016 11:46:47 +0300 Subject: [PATCH 33/47] Typo --- spec/spec_helper.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 8ad89ff..ff6a839 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -1,5 +1,5 @@ require "simplecov" -SimpleCov.start" +SimpleCov.start require 'torckapi' From db431e84afd9ca20f75bab585789ad4e24d2b8ff Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Mon, 7 Nov 2016 12:00:20 +0300 Subject: [PATCH 34/47] Update torckapi.gemspec --- torckapi.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/torckapi.gemspec b/torckapi.gemspec index 1043da4..02f250f 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,6 +21,7 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' + gem.add_development_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" gem.add_development_dependency 'simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From c3811495504a14c5dcf32c5b27d107ea96fd0009 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 02:46:15 +0300 Subject: [PATCH 35/47] Update torckapi.gemspec --- torckapi.gemspec | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index 02f250f..274fcdf 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -18,10 +18,10 @@ Gem::Specification.new do |gem| gem.licenses = ["MIT"] gem.add_dependency 'bencode', '~> 0' - + gem.add_runtime_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" + gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" gem.add_development_dependency 'simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From 7c26c3e5b19f104d57afb31e6c5eb7e25d384ac1 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 03:22:45 +0300 Subject: [PATCH 36/47] Update torckapi.gemspec --- torckapi.gemspec | 2 -- 1 file changed, 2 deletions(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index 274fcdf..39182a6 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -18,10 +18,8 @@ Gem::Specification.new do |gem| gem.licenses = ["MIT"] gem.add_dependency 'bencode', '~> 0' - gem.add_runtime_dependency "json", "~> 1.8", "< 2" if RUBY_VERSION < "2" gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency 'simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From ea6872084eb63dda0669f9c4752690c3b4f612c8 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 03:25:10 +0300 Subject: [PATCH 37/47] Update torckapi.gemspec --- torckapi.gemspec | 1 + 1 file changed, 1 insertion(+) diff --git a/torckapi.gemspec b/torckapi.gemspec index 39182a6..fc074a4 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,5 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' + gem.add_development_dependency 'simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From 48ba23457df13d483a6a5a61ab1cc5f6ecc10d20 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 04:11:23 +0300 Subject: [PATCH 38/47] Update torckapi.gemspec --- torckapi.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index fc074a4..b748188 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,6 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency 'simplecov' + gem.add_development_dependency 'simplecov', git: 'https://github.com/1v/simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From 4d57be1b75633e26ce5b1e45f4bacb6c4dff5cdc Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 04:21:29 +0300 Subject: [PATCH 39/47] Update torckapi.gemspec --- torckapi.gemspec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/torckapi.gemspec b/torckapi.gemspec index b748188..fc074a4 100644 --- a/torckapi.gemspec +++ b/torckapi.gemspec @@ -21,6 +21,6 @@ Gem::Specification.new do |gem| gem.add_development_dependency 'rake' gem.add_development_dependency 'rspec', '~> 3.2' - gem.add_development_dependency 'simplecov', git: 'https://github.com/1v/simplecov' + gem.add_development_dependency 'simplecov' gem.add_development_dependency 'codeclimate-test-reporter', '~> 1.0' end From 1cd94ed070eefdc27f1f53b993de956bcf505e66 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Tue, 8 Nov 2016 10:42:09 +0300 Subject: [PATCH 40/47] json --- Gemfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Gemfile b/Gemfile index fa75df1..0247523 100644 --- a/Gemfile +++ b/Gemfile @@ -1,3 +1,7 @@ source 'https://rubygems.org' +group :test do + gem "json", Gem::Version.new(RUBY_VERSION) < Gem::Version.new("2") ? "< 2" : ">= 2" +end + gemspec From 203696c2210fee329b9630dca95569c536a8db78 Mon Sep 17 00:00:00 2001 From: Artem <1v@users.noreply.github.com> Date: Thu, 10 Nov 2016 00:07:44 +0300 Subject: [PATCH 41/47] Update .travis.yml --- .travis.yml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 52ad245..c378d28 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,8 @@ rvm: - 1.9.3 - 2.0.0 - - 2.1.7 - - 2.2.1 - - 2.2.3 + - 2.1.10 + - 2.2.5 - 2.3.1 addons: code_climate: From c9892376716ade541c8d0e01fabe0cbc7ad036b1 Mon Sep 17 00:00:00 2001 From: Robert Rowe Date: Sat, 20 May 2017 20:55:16 -0700 Subject: [PATCH 42/47] Eliminate using ruby's Timeout module Timeout is noted to be completely unsafe, and unreliable to use. Originally, this would hang on failed UDP reads forever (noted running in jruby). Use IO#select instead, with appropriate timeout. --- lib/torckapi/tracker/udp.rb | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/torckapi/tracker/udp.rb b/lib/torckapi/tracker/udp.rb index 6f2843d..71493af 100644 --- a/lib/torckapi/tracker/udp.rb +++ b/lib/torckapi/tracker/udp.rb @@ -1,5 +1,4 @@ require 'socket' -require 'timeout' require 'securerandom' require 'torckapi/tracker/base' @@ -64,29 +63,29 @@ def connect def communicate(action, data = nil) @socket ||= UDPSocket.new - tries = 0 response = nil - begin connect transaction_id = SecureRandom.random_bytes(4) packet = [@connection_id, [action].pack('L>'), transaction_id, data].join - - Timeout::timeout(@options[:timeout], CommunicationTimeoutError) do @socket.send(packet, 0, @url.host, @url.port) - response = process_response @socket.recvfrom(65536)[0], transaction_id - @communicated_at = Time.now - end + ready = IO.select([@socket], nil, nil, @options[:timeout]) + if ready + response = process_response @socket.recvfrom(65536)[0], transaction_id + @communicated_at = Time.now + else + raise CommunicationTimeoutError + end response rescue CommunicationTimeoutError, LittleEndianResponseError => e if (tries += 1) <= @options[:tries] - retry + retry else - raise CommunicationFailedError + raise CommunicationFailedError end - end - end + end + end def process_response(response, transaction_id) check_transaction_id response, transaction_id From b000225b6a3068eb858ed8290fe3594ed849e383 Mon Sep 17 00:00:00 2001 From: Robert Rowe Date: Sat, 20 May 2017 20:57:01 -0700 Subject: [PATCH 43/47] Allow proper loading of failed Bencoded data When returned with a failure of a response, originally this will raise a MalformedResponseError well, erroneously. The response is proper, and should carry on to raise the next error later, for proper debugging purposes. --- lib/torckapi/response/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi/response/base.rb b/lib/torckapi/response/base.rb index 50e4d43..f742a28 100644 --- a/lib/torckapi/response/base.rb +++ b/lib/torckapi/response/base.rb @@ -7,7 +7,7 @@ class Base def self.bdecode_and_check(data, key) begin - bdecoded_data = BEncode.load(data) + bdecoded_data = BEncode.load(data, :ignore_trailing_junk => true) rescue BEncode::DecodeError raise Torckapi::Tracker::MalformedResponseError, "Can't decode '%s'" % data end From 8802ba3d0824a0192de58399764e59445a2b2bed Mon Sep 17 00:00:00 2001 From: Robert Rowe Date: Sun, 21 May 2017 17:13:51 -0700 Subject: [PATCH 44/47] Return response directly Also fix identation, maybe travis tests? --- lib/torckapi/tracker/udp.rb | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/torckapi/tracker/udp.rb b/lib/torckapi/tracker/udp.rb index 71493af..09b502c 100644 --- a/lib/torckapi/tracker/udp.rb +++ b/lib/torckapi/tracker/udp.rb @@ -69,15 +69,14 @@ def communicate(action, data = nil) connect transaction_id = SecureRandom.random_bytes(4) packet = [@connection_id, [action].pack('L>'), transaction_id, data].join - @socket.send(packet, 0, @url.host, @url.port) - ready = IO.select([@socket], nil, nil, @options[:timeout]) - if ready - response = process_response @socket.recvfrom(65536)[0], transaction_id - @communicated_at = Time.now - else - raise CommunicationTimeoutError - end - response + @socket.send(packet, 0, @url.host, @url.port) + if IO.select([@socket], nil, nil, @options[:timeout]) + response = process_response @socket.recvfrom(65536)[0], transaction_id + @communicated_at = Time.now + else + raise CommunicationTimeoutError + end + return response rescue CommunicationTimeoutError, LittleEndianResponseError => e if (tries += 1) <= @options[:tries] retry From 5262935bf43adf18d10be95c926df5d643f8b5d5 Mon Sep 17 00:00:00 2001 From: Robert Rowe Date: Sun, 21 May 2017 17:20:06 -0700 Subject: [PATCH 45/47] Revert "Allow proper loading of failed Bencoded data" This reverts commit b000225b6a3068eb858ed8290fe3594ed849e383. --- lib/torckapi/response/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi/response/base.rb b/lib/torckapi/response/base.rb index f742a28..50e4d43 100644 --- a/lib/torckapi/response/base.rb +++ b/lib/torckapi/response/base.rb @@ -7,7 +7,7 @@ class Base def self.bdecode_and_check(data, key) begin - bdecoded_data = BEncode.load(data, :ignore_trailing_junk => true) + bdecoded_data = BEncode.load(data) rescue BEncode::DecodeError raise Torckapi::Tracker::MalformedResponseError, "Can't decode '%s'" % data end From 7632a43d6157fc82c99d4a35a31f1183adf9cfae Mon Sep 17 00:00:00 2001 From: 1v Date: Mon, 22 May 2017 02:51:53 +0200 Subject: [PATCH 46/47] Fix specs --- .travis.yml | 3 ++- lib/torckapi/tracker/udp.rb | 16 ++++++++-------- spec/torckapi_spec.rb | 1 + 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.travis.yml b/.travis.yml index c378d28..a34a30f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,7 +3,8 @@ rvm: - 2.0.0 - 2.1.10 - 2.2.5 - - 2.3.1 + - 2.3.4 + - 2.4.1 addons: code_climate: repo_token: 3004a7854020df72de40cef4c1f7fc1992ca1969b5420f548df7f4ab6a9b881b diff --git a/lib/torckapi/tracker/udp.rb b/lib/torckapi/tracker/udp.rb index 09b502c..887a2c4 100644 --- a/lib/torckapi/tracker/udp.rb +++ b/lib/torckapi/tracker/udp.rb @@ -8,12 +8,12 @@ module Tracker class UDP < Base def announce(info_hash, peer_id = SecureRandom.random_bytes(20)) super - perform_request Announce, announce_request_data(info_hash, peer_id), info_hash + perform_request(Announce, announce_request_data(info_hash, peer_id), info_hash) end def scrape(info_hashes = []) super - perform_request Scrape, scrape_request_data(info_hashes), info_hashes + perform_request(Scrape, scrape_request_data(info_hashes), info_hashes) end private @@ -40,7 +40,7 @@ def connecting? end def perform_request(action, data, *args) - response = communicate action, data + response = communicate(action, data) RESPONSE_CLASSES[response[:code]].from_udp(*args, response[:data]) end @@ -57,7 +57,7 @@ def connect return if connected? || connecting? @state, @connection_id = :connecting, [0x041727101980].pack('Q>') - response = communicate Connect + response = communicate(Connect) @state, @connection_id = nil, response[:data] end @@ -71,7 +71,7 @@ def communicate(action, data = nil) packet = [@connection_id, [action].pack('L>'), transaction_id, data].join @socket.send(packet, 0, @url.host, @url.port) if IO.select([@socket], nil, nil, @options[:timeout]) - response = process_response @socket.recvfrom(65536)[0], transaction_id + response = process_response(@socket.recvfrom(65536)[0], transaction_id) @communicated_at = Time.now else raise CommunicationTimeoutError @@ -87,9 +87,9 @@ def communicate(action, data = nil) end def process_response(response, transaction_id) - check_transaction_id response, transaction_id - response_code = extract_response_code response - check_response_length response, response_code + check_transaction_id(response, transaction_id) + response_code = extract_response_code(response) + check_response_length(response, response_code) {code: response_code, data: response[8..-1]} end diff --git a/spec/torckapi_spec.rb b/spec/torckapi_spec.rb index edfa1a5..6763220 100644 --- a/spec/torckapi_spec.rb +++ b/spec/torckapi_spec.rb @@ -14,6 +14,7 @@ @udp = double allow(UDPSocket).to receive(:new).and_return @udp allow(@udp).to receive(:send).and_return @udp + allow(IO).to receive(:select).and_return true allow(SecureRandom).to receive(:random_bytes).and_call_original end From 159e9168a8723ae52459c5c4297ecbd4527e0e02 Mon Sep 17 00:00:00 2001 From: Robert Rowe Date: Sun, 21 May 2017 18:02:29 -0700 Subject: [PATCH 47/47] Revert "Revert "Allow proper loading of failed Bencoded data"" This reverts commit 5262935bf43adf18d10be95c926df5d643f8b5d5. --- lib/torckapi/response/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/torckapi/response/base.rb b/lib/torckapi/response/base.rb index 50e4d43..f742a28 100644 --- a/lib/torckapi/response/base.rb +++ b/lib/torckapi/response/base.rb @@ -7,7 +7,7 @@ class Base def self.bdecode_and_check(data, key) begin - bdecoded_data = BEncode.load(data) + bdecoded_data = BEncode.load(data, :ignore_trailing_junk => true) rescue BEncode::DecodeError raise Torckapi::Tracker::MalformedResponseError, "Can't decode '%s'" % data end