tor_requests 0.4.0 → 0.5.0

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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: db0ac25341693bafea5996c448ef54db15aa0fde
4
+ data.tar.gz: 55d973833d109be95f02a01dee6750fb98f4bb38
5
+ SHA512:
6
+ metadata.gz: e0d929d85ef4bcc132be60487d39e6e7125811bdea881b2f5853ede1e4fa0536722d7a90d51d7bb19fcfb3d4d7d3730600e6603669c81cb1329cc2cd3a85c08f
7
+ data.tar.gz: 9defd11b28a878c01703d016de736a2efeef137360830c2c5e5f6f26a32414f50e5c426e026ce8c4fcf8c5a2a0379a82972d321fa9ff46b083c48d4d8eaedb35
data/Gemfile CHANGED
@@ -6,10 +6,10 @@ source "http://rubygems.org"
6
6
  # Add dependencies to develop your gem here.
7
7
  # Include everything needed to run rake, tests, features, etc.
8
8
  group :development do
9
- gem "rspec", "~> 2.8.0"
9
+ gem "rspec", "~> 2.11.0"
10
10
  gem "rdoc", "~> 3.12"
11
- gem "bundler", "~> 1.0.0"
12
- gem "jeweler", "~> 1.8.3"
11
+ gem "bundler", "~> 1.3.5"
12
+ gem "jeweler", "~> 2.0.1"
13
13
  gem "simplecov"
14
14
  gem "socksify"
15
15
  end
data/Gemfile.lock CHANGED
@@ -1,26 +1,51 @@
1
1
  GEM
2
2
  remote: http://rubygems.org/
3
3
  specs:
4
+ addressable (2.3.6)
5
+ builder (3.2.2)
4
6
  diff-lcs (1.1.3)
5
- git (1.2.5)
6
- jeweler (1.8.3)
7
- bundler (~> 1.0)
7
+ faraday (0.7.6)
8
+ addressable (~> 2.2)
9
+ multipart-post (~> 1.1)
10
+ rack (~> 1.1)
11
+ git (1.2.6)
12
+ github_api (0.4.10)
13
+ faraday (~> 0.7.6)
14
+ hashie (~> 1.2.0)
15
+ multi_json (~> 1.0)
16
+ oauth2 (~> 0.5.2)
17
+ hashie (1.2.0)
18
+ highline (1.6.21)
19
+ jeweler (2.0.1)
20
+ builder
21
+ bundler (>= 1.0)
8
22
  git (>= 1.2.5)
23
+ github_api
24
+ highline (>= 1.6.15)
25
+ nokogiri (>= 1.5.10)
9
26
  rake
10
27
  rdoc
11
28
  json (1.7.3)
29
+ mini_portile (0.5.3)
12
30
  multi_json (1.3.6)
13
- rake (0.9.2.2)
31
+ multipart-post (1.2.0)
32
+ nokogiri (1.6.1)
33
+ mini_portile (~> 0.5.0)
34
+ oauth2 (0.5.2)
35
+ faraday (~> 0.7)
36
+ multi_json (~> 1.0)
37
+ rack (1.5.2)
38
+ rake (10.2.2)
14
39
  rdoc (3.12)
15
40
  json (~> 1.4)
16
- rspec (2.8.0)
17
- rspec-core (~> 2.8.0)
18
- rspec-expectations (~> 2.8.0)
19
- rspec-mocks (~> 2.8.0)
20
- rspec-core (2.8.0)
21
- rspec-expectations (2.8.0)
22
- diff-lcs (~> 1.1.2)
23
- rspec-mocks (2.8.0)
41
+ rspec (2.11.0)
42
+ rspec-core (~> 2.11.0)
43
+ rspec-expectations (~> 2.11.0)
44
+ rspec-mocks (~> 2.11.0)
45
+ rspec-core (2.11.1)
46
+ rspec-expectations (2.11.3)
47
+ diff-lcs (~> 1.1.3)
48
+ rspec-mocks (2.11.3)
24
49
  simplecov (0.6.4)
25
50
  multi_json (~> 1.0)
26
51
  simplecov-html (~> 0.5.3)
@@ -31,9 +56,9 @@ PLATFORMS
31
56
  ruby
32
57
 
33
58
  DEPENDENCIES
34
- bundler (~> 1.0.0)
35
- jeweler (~> 1.8.3)
59
+ bundler (~> 1.3.5)
60
+ jeweler (~> 2.0.1)
36
61
  rdoc (~> 3.12)
37
- rspec (~> 2.8.0)
62
+ rspec (~> 2.11.0)
38
63
  simplecov
39
64
  socksify
data/README.rdoc CHANGED
@@ -6,8 +6,8 @@
6
6
  * Start Tor
7
7
  * You can change port configuration by clicking on Settings -> Advanced -> Adjust the port to 9050
8
8
 
9
- 2 - Ruby code
10
-
9
+ 2 - Usage
10
+
11
11
  res = Tor::HTTP.get("google.com", "/", 80)
12
12
  p res.code
13
13
  p res.body
@@ -16,10 +16,12 @@
16
16
  p res.code
17
17
  p res.body
18
18
 
19
- OR
19
+ with URIs (http & https)
20
+
21
+ Tor::HTTP.get(URI('http://google.com/'))
22
+ Tor::HTTP.get(URI('https://github.com/'))
23
+ Tor::HTTP.post(URI('http://posttestserver.com/post.php?dir=example'), {"var" => "variable"})
20
24
 
21
- res = Tor::HTTP.get(URI('http://google.com/'))
22
- res = Tor::HTTP.post(URI('http://posttestserver.com/post.php?dir=example'), {"var" => "variable"})
23
25
 
24
26
  The default port configuration is 9050 and ip configuration is 127.0.0.1. If you need to change configuration, you can use:
25
27
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.0
1
+ 0.5.0
@@ -7,19 +7,19 @@ module Tor
7
7
 
8
8
  attr_accessor :ip,
9
9
  :port
10
-
10
+
11
11
  attr_reader :headers
12
-
12
+
13
13
  def add_header(header, value)
14
14
  @headers[header] = value
15
15
  end
16
-
16
+
17
17
  def initialize
18
- @ip = '127.0.0.1'
19
- @port = 9050
18
+ @ip = '127.0.0.1'
19
+ @port = 9050
20
20
  @headers = Hash.new
21
- end
22
-
21
+ end
22
+
23
23
  end
24
24
 
25
25
  end
data/lib/tor/http.rb CHANGED
@@ -4,31 +4,40 @@ require 'socksify/http'
4
4
  module Tor
5
5
 
6
6
  class HTTP
7
+ class TooManyRedirects < StandardError; end
8
+ REDIRECT_LIMIT = 3
9
+
10
+ class << self
11
+ attr_accessor :redirects_count
12
+ end
7
13
 
8
14
  def self.get(uri_or_host, path = nil, port = nil)
9
- res = ""
10
- host = nil
15
+ res, host = "", nil
16
+ self.redirects_count = 0
17
+
11
18
  if path
12
19
  host = uri_or_host
13
20
  else
14
21
  host = uri_or_host.host
15
22
  port = uri_or_host.port
16
23
  end
17
- Net::HTTP.SOCKSProxy(Tor.configuration.ip, Tor.configuration.port).start(host, port) do |http|
24
+
25
+ start_params = start_parameters(uri_or_host, host, port)
26
+ start_socks_proxy(start_params) do |http|
18
27
  request = Net::HTTP::Get.new(path || uri_or_host.path)
19
28
  Tor.configuration.headers.each do |header, value|
20
29
  request.delete(header)
21
30
  request.add_field(header, value)
22
31
  end
23
-
24
- res = http.request(request);
32
+
33
+ res = http.request(request)
34
+ res = follow_redirect(res, http) # Follow redirects
25
35
  end
26
36
  res
27
37
  end
28
-
38
+
29
39
  def self.post(uri_or_host, post_options = {}, path = nil, port = nil)
30
- res = ""
31
- host = nil
40
+ res, host = "", nil
32
41
  if path
33
42
  host = uri_or_host
34
43
  else
@@ -37,7 +46,8 @@ module Tor
37
46
  path = uri_or_host.request_uri
38
47
  end
39
48
 
40
- Net::HTTP.SOCKSProxy(Tor.configuration.ip, Tor.configuration.port).start(host, port) do |http|
49
+ start_params = start_parameters(uri_or_host, host, port)
50
+ start_socks_proxy(start_params) do |http|
41
51
  request = Net::HTTP::Post.new(path)
42
52
  request.set_form_data(post_options)
43
53
  Tor.configuration.headers.each do |header, value|
@@ -46,10 +56,52 @@ module Tor
46
56
  end
47
57
  res = http.request(request)
48
58
  end
59
+
49
60
  res
50
61
  end
51
62
 
63
+ private
64
+
65
+ def self.start_socks_proxy(start_params, &code_block)
66
+ Net::HTTP.SOCKSProxy(Tor.configuration.ip, Tor.configuration.port).
67
+ start(*start_params) { |http| code_block.call(http) }
68
+ end
69
+
70
+ def self.start_parameters(uri_or_host, host, port)
71
+ uri_or_host = URI.parse(uri_or_host) if uri_or_host.is_a? String
72
+ [
73
+ host, port,
74
+ :use_ssl => uri_or_host.scheme == 'https',
75
+ :verify_mode => OpenSSL::SSL::VERIFY_NONE
76
+ ]
77
+ end
78
+
79
+ def self.follow_redirect(response, http)
80
+ if response.kind_of?(Net::HTTPRedirection)
81
+ raise TooManyRedirects if self.redirects_count >= REDIRECT_LIMIT
82
+
83
+ request = Net::HTTP::Get.new(fetch_redirect_url(response))
84
+ response = http.request(request)
85
+ self.redirects_count += 1
86
+ response = follow_redirect(response, http)
87
+
88
+ else
89
+ response
90
+ end
91
+
92
+ end
93
+
94
+ # Get the redirect url from the response.
95
+ # It searches in the "location" header and response body
96
+ def self.fetch_redirect_url(response)
97
+ if response['location'].nil?
98
+ response.body.match(/<a href=\"([^>]+)\">/i)[1]
99
+ else
100
+ response['location']
101
+ end
102
+ end
103
+
52
104
  end
53
105
 
54
106
  end
55
-
107
+
data/spec/http_spec.rb CHANGED
@@ -1,56 +1,63 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
-
4
3
  describe "Http" do
5
-
4
+
6
5
  describe "get" do
7
-
6
+
8
7
  context "with invalid parameters" do
9
8
  it "does not work" do
10
9
  expect { Tor::HTTP.get("google.com") }.to raise_error
11
10
  end
12
11
  end
13
-
12
+
14
13
  context "with URI parameter" do
15
- it "works" do
16
- res = Tor::HTTP.get(URI('http://google.com/'))
17
- res.code.should eq("301")
14
+ ["http", "https"].each do |protocol|
15
+ it "follows the #{protocol} redirects" do
16
+ res = Tor::HTTP.get(URI("#{protocol}://google.com/"))
17
+ res.code.should eq("200")
18
+ end
19
+
20
+ it "raises TooManyRedirects error" do
21
+ stub_const("Tor::HTTP::REDIRECT_LIMIT", 1)
22
+ expect { Tor::HTTP.get(URI("#{protocol}://google.com/")) }.to raise_error("Tor::HTTP::TooManyRedirects")
23
+ end
18
24
  end
19
25
  end
20
-
26
+
21
27
  context "with host, path and port parameters" do
22
28
  it "works" do
23
29
  res = Tor::HTTP.get("google.com", "/", 80)
24
- res.code.should eq("301")
30
+ res.code.should eq("200")
25
31
  end
26
-
27
32
  end
28
-
33
+
29
34
  end
30
35
 
31
36
  describe "post" do
32
-
37
+
33
38
  context "with invalid parameters" do
34
39
  it "does not work" do
35
40
  expect { Tor::HTTP.post("google.com") }.to raise_error
36
41
  end
37
42
  end
38
-
43
+
39
44
  context "with URI parameter" do
40
- it "works" do
41
- res = Tor::HTTP.post(URI('http://posttestserver.com/post.php?dir=example'), {"q" => "query", "var" => "variable"})
42
- res.code.should eq("200")
45
+ ["http", "https"].each do |protocol|
46
+ it "works with #{protocol}" do
47
+ res = Tor::HTTP.post(URI("#{protocol}://posttestserver.com/post.php?dir=example"), {"q" => "query", "var" => "variable"})
48
+ res.code.should eq("200")
49
+ end
43
50
  end
44
51
  end
45
-
52
+
46
53
  context "with host, path and port parameters" do
47
54
  it "works" do
48
55
  res = Tor::HTTP.post('posttestserver.com', {"q" => "query", "var" => "variable"}, '/post.php?dir=example', 80)
49
56
  res.code.should eq("200")
50
57
  end
51
-
58
+
52
59
  end
53
-
60
+
54
61
  end
55
62
 
56
63
  end
data/tor_requests.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "tor_requests"
8
- s.version = "0.4.0"
8
+ s.version = "0.5.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Bruno Ghisi"]
12
- s.date = "2013-07-20"
12
+ s.date = "2014-04-07"
13
13
  s.description = "Create anonymously requests through Tor network"
14
14
  s.email = "brunogh@gmail.com"
15
15
  s.extra_rdoc_files = [
@@ -39,34 +39,34 @@ Gem::Specification.new do |s|
39
39
  s.homepage = "http://github.com/brunogh/tor_requests"
40
40
  s.licenses = ["MIT"]
41
41
  s.require_paths = ["lib"]
42
- s.rubygems_version = "1.8.15"
42
+ s.rubygems_version = "2.0.3"
43
43
  s.summary = "Create anonymously requests through Tor network"
44
44
 
45
45
  if s.respond_to? :specification_version then
46
- s.specification_version = 3
46
+ s.specification_version = 4
47
47
 
48
48
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
49
- s.add_development_dependency(%q<rspec>, ["~> 2.8.0"])
49
+ s.add_development_dependency(%q<rspec>, ["~> 2.11.0"])
50
50
  s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
51
- s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
52
- s.add_development_dependency(%q<jeweler>, ["~> 1.8.3"])
51
+ s.add_development_dependency(%q<bundler>, ["~> 1.3.5"])
52
+ s.add_development_dependency(%q<jeweler>, ["~> 2.0.1"])
53
53
  s.add_development_dependency(%q<simplecov>, [">= 0"])
54
54
  s.add_development_dependency(%q<socksify>, [">= 0"])
55
55
  s.add_runtime_dependency(%q<socksify>, [">= 0"])
56
56
  else
57
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
57
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
58
58
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
59
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
60
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
59
+ s.add_dependency(%q<bundler>, ["~> 1.3.5"])
60
+ s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
61
61
  s.add_dependency(%q<simplecov>, [">= 0"])
62
62
  s.add_dependency(%q<socksify>, [">= 0"])
63
63
  s.add_dependency(%q<socksify>, [">= 0"])
64
64
  end
65
65
  else
66
- s.add_dependency(%q<rspec>, ["~> 2.8.0"])
66
+ s.add_dependency(%q<rspec>, ["~> 2.11.0"])
67
67
  s.add_dependency(%q<rdoc>, ["~> 3.12"])
68
- s.add_dependency(%q<bundler>, ["~> 1.0.0"])
69
- s.add_dependency(%q<jeweler>, ["~> 1.8.3"])
68
+ s.add_dependency(%q<bundler>, ["~> 1.3.5"])
69
+ s.add_dependency(%q<jeweler>, ["~> 2.0.1"])
70
70
  s.add_dependency(%q<simplecov>, [">= 0"])
71
71
  s.add_dependency(%q<socksify>, [">= 0"])
72
72
  s.add_dependency(%q<socksify>, [">= 0"])
metadata CHANGED
@@ -1,93 +1,113 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tor_requests
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Bruno Ghisi
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-07-20 00:00:00.000000000Z
11
+ date: 2014-04-07 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: rspec
16
- requirement: &70124356799160 !ruby/object:Gem::Requirement
17
- none: false
15
+ requirement: !ruby/object:Gem::Requirement
18
16
  requirements:
19
17
  - - ~>
20
18
  - !ruby/object:Gem::Version
21
- version: 2.8.0
19
+ version: 2.11.0
22
20
  type: :development
23
21
  prerelease: false
24
- version_requirements: *70124356799160
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: 2.11.0
25
27
  - !ruby/object:Gem::Dependency
26
28
  name: rdoc
27
- requirement: &70124356798520 !ruby/object:Gem::Requirement
28
- none: false
29
+ requirement: !ruby/object:Gem::Requirement
29
30
  requirements:
30
31
  - - ~>
31
32
  - !ruby/object:Gem::Version
32
33
  version: '3.12'
33
34
  type: :development
34
35
  prerelease: false
35
- version_requirements: *70124356798520
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '3.12'
36
41
  - !ruby/object:Gem::Dependency
37
42
  name: bundler
38
- requirement: &70124356797860 !ruby/object:Gem::Requirement
39
- none: false
43
+ requirement: !ruby/object:Gem::Requirement
40
44
  requirements:
41
45
  - - ~>
42
46
  - !ruby/object:Gem::Version
43
- version: 1.0.0
47
+ version: 1.3.5
44
48
  type: :development
45
49
  prerelease: false
46
- version_requirements: *70124356797860
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: 1.3.5
47
55
  - !ruby/object:Gem::Dependency
48
56
  name: jeweler
49
- requirement: &70124356797300 !ruby/object:Gem::Requirement
50
- none: false
57
+ requirement: !ruby/object:Gem::Requirement
51
58
  requirements:
52
59
  - - ~>
53
60
  - !ruby/object:Gem::Version
54
- version: 1.8.3
61
+ version: 2.0.1
55
62
  type: :development
56
63
  prerelease: false
57
- version_requirements: *70124356797300
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: 2.0.1
58
69
  - !ruby/object:Gem::Dependency
59
70
  name: simplecov
60
- requirement: &70124356796760 !ruby/object:Gem::Requirement
61
- none: false
71
+ requirement: !ruby/object:Gem::Requirement
62
72
  requirements:
63
- - - ! '>='
73
+ - - '>='
64
74
  - !ruby/object:Gem::Version
65
75
  version: '0'
66
76
  type: :development
67
77
  prerelease: false
68
- version_requirements: *70124356796760
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: socksify
71
- requirement: &70124356796120 !ruby/object:Gem::Requirement
72
- none: false
85
+ requirement: !ruby/object:Gem::Requirement
73
86
  requirements:
74
- - - ! '>='
87
+ - - '>='
75
88
  - !ruby/object:Gem::Version
76
89
  version: '0'
77
90
  type: :development
78
91
  prerelease: false
79
- version_requirements: *70124356796120
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '>='
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
80
97
  - !ruby/object:Gem::Dependency
81
98
  name: socksify
82
- requirement: &70124356795540 !ruby/object:Gem::Requirement
83
- none: false
99
+ requirement: !ruby/object:Gem::Requirement
84
100
  requirements:
85
- - - ! '>='
101
+ - - '>='
86
102
  - !ruby/object:Gem::Version
87
103
  version: '0'
88
104
  type: :runtime
89
105
  prerelease: false
90
- version_requirements: *70124356795540
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
91
111
  description: Create anonymously requests through Tor network
92
112
  email: brunogh@gmail.com
93
113
  executables: []
@@ -117,29 +137,25 @@ files:
117
137
  homepage: http://github.com/brunogh/tor_requests
118
138
  licenses:
119
139
  - MIT
140
+ metadata: {}
120
141
  post_install_message:
121
142
  rdoc_options: []
122
143
  require_paths:
123
144
  - lib
124
145
  required_ruby_version: !ruby/object:Gem::Requirement
125
- none: false
126
146
  requirements:
127
- - - ! '>='
147
+ - - '>='
128
148
  - !ruby/object:Gem::Version
129
149
  version: '0'
130
- segments:
131
- - 0
132
- hash: -1434211554258270422
133
150
  required_rubygems_version: !ruby/object:Gem::Requirement
134
- none: false
135
151
  requirements:
136
- - - ! '>='
152
+ - - '>='
137
153
  - !ruby/object:Gem::Version
138
154
  version: '0'
139
155
  requirements: []
140
156
  rubyforge_project:
141
- rubygems_version: 1.8.15
157
+ rubygems_version: 2.0.3
142
158
  signing_key:
143
- specification_version: 3
159
+ specification_version: 4
144
160
  summary: Create anonymously requests through Tor network
145
161
  test_files: []