tor_requests 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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: []