typhoeus 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGELOG.markdown +14 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +2 -0
- data/LICENSE +20 -0
- data/README.textile +39 -5
- data/Rakefile +8 -5
- data/VERSION +1 -1
- data/examples/file.rb +12 -0
- data/examples/times.rb +40 -0
- data/ext/typhoeus/.gitignore +2 -1
- data/ext/typhoeus/native.c +1 -0
- data/ext/typhoeus/native.h +1 -0
- data/ext/typhoeus/typhoeus_easy.c +32 -7
- data/ext/typhoeus/typhoeus_easy.h +1 -0
- data/ext/typhoeus/typhoeus_form.c +59 -0
- data/ext/typhoeus/typhoeus_form.h +13 -0
- data/ext/typhoeus/typhoeus_multi.c +15 -29
- data/lib/typhoeus.rb +1 -0
- data/lib/typhoeus/easy.rb +70 -48
- data/lib/typhoeus/form.rb +47 -0
- data/lib/typhoeus/hydra.rb +40 -7
- data/lib/typhoeus/hydra/connect_options.rb +19 -3
- data/lib/typhoeus/multi.rb +7 -5
- data/lib/typhoeus/remote.rb +1 -1
- data/lib/typhoeus/remote_proxy_object.rb +2 -0
- data/lib/typhoeus/request.rb +15 -3
- data/lib/typhoeus/response.rb +16 -1
- data/spec/fixtures/placeholder.gif +0 -0
- data/spec/fixtures/placeholder.txt +1 -0
- data/spec/fixtures/placeholder.ukn +0 -0
- data/spec/servers/app.rb +9 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/typhoeus/easy_spec.rb +55 -6
- data/spec/typhoeus/filter_spec.rb +2 -2
- data/spec/typhoeus/form_spec.rb +106 -0
- data/spec/typhoeus/hydra_mock_spec.rb +1 -1
- data/spec/typhoeus/hydra_spec.rb +108 -38
- data/spec/typhoeus/multi_spec.rb +1 -1
- data/spec/typhoeus/normalized_header_hash_spec.rb +1 -1
- data/spec/typhoeus/remote_method_spec.rb +2 -2
- data/spec/typhoeus/remote_proxy_object_spec.rb +1 -1
- data/spec/typhoeus/remote_spec.rb +1 -1
- data/spec/typhoeus/request_spec.rb +31 -2
- data/spec/typhoeus/response_spec.rb +13 -1
- data/spec/typhoeus/utils_spec.rb +1 -1
- data/typhoeus.gemspec +23 -6
- metadata +39 -19
@@ -12,9 +12,10 @@ module Typhoeus
|
|
12
12
|
#
|
13
13
|
# @raises NetConnectNotAllowedError
|
14
14
|
def check_allow_net_connect!(request)
|
15
|
-
if
|
16
|
-
|
17
|
-
|
15
|
+
return if Typhoeus::Hydra.allow_net_connect?
|
16
|
+
return if Typhoeus::Hydra.ignore_hosts.include?(request.host_domain)
|
17
|
+
|
18
|
+
raise NetConnectNotAllowedError, "Real HTTP requests are not allowed. Unregistered request: #{request.inspect}"
|
18
19
|
end
|
19
20
|
private :check_allow_net_connect!
|
20
21
|
|
@@ -39,7 +40,22 @@ module Typhoeus
|
|
39
40
|
def ignore_localhost?
|
40
41
|
ignore_localhost
|
41
42
|
end
|
43
|
+
|
44
|
+
def ignore_hosts
|
45
|
+
@ignore_hosts ||= []
|
46
|
+
|
47
|
+
if ignore_localhost?
|
48
|
+
@ignore_hosts + Typhoeus::Request::LOCALHOST_ALIASES
|
49
|
+
else
|
50
|
+
@ignore_hosts
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def ignore_hosts=(hosts)
|
55
|
+
@ignore_hosts = hosts
|
56
|
+
end
|
42
57
|
end
|
43
58
|
end
|
44
59
|
end
|
45
60
|
end
|
61
|
+
|
data/lib/typhoeus/multi.rb
CHANGED
@@ -3,16 +3,16 @@ module Typhoeus
|
|
3
3
|
attr_reader :easy_handles
|
4
4
|
|
5
5
|
def initialize
|
6
|
-
|
6
|
+
@easy_handles = []
|
7
7
|
end
|
8
8
|
|
9
9
|
def remove(easy)
|
10
|
-
multi_remove_handle(easy)
|
10
|
+
multi_remove_handle(easy) if @easy_handles.include?(easy)
|
11
11
|
end
|
12
12
|
|
13
13
|
def add(easy)
|
14
|
+
raise "trying to add easy handle twice" if @easy_handles.include?(easy)
|
14
15
|
easy.set_headers() if easy.headers.empty?
|
15
|
-
@easy_handles << easy
|
16
16
|
multi_add_handle(easy)
|
17
17
|
end
|
18
18
|
|
@@ -27,9 +27,11 @@ module Typhoeus
|
|
27
27
|
multi_cleanup
|
28
28
|
end
|
29
29
|
|
30
|
-
private
|
31
30
|
def reset_easy_handles
|
32
|
-
@easy_handles
|
31
|
+
@easy_handles.dup.each do |easy|
|
32
|
+
multi_remove_handle(easy)
|
33
|
+
yield easy if block_given?
|
34
|
+
end
|
33
35
|
end
|
34
36
|
end
|
35
37
|
end
|
data/lib/typhoeus/remote.rb
CHANGED
@@ -22,6 +22,8 @@ module Typhoeus
|
|
22
22
|
unless @proxied_object
|
23
23
|
Typhoeus.perform_easy_requests
|
24
24
|
response = Response.new(:code => @easy.response_code,
|
25
|
+
:curl_return_code => @easy.curl_return_code,
|
26
|
+
:curl_error_message => @easy.curl_error_message,
|
25
27
|
:headers => @easy.response_header,
|
26
28
|
:body => @easy.response_body,
|
27
29
|
:time => @easy.total_time_taken,
|
data/lib/typhoeus/request.rb
CHANGED
@@ -6,10 +6,12 @@ module Typhoeus
|
|
6
6
|
attr_writer :headers
|
7
7
|
attr_accessor :method, :params, :body, :connect_timeout, :timeout,
|
8
8
|
:user_agent, :response, :cache_timeout, :follow_location,
|
9
|
-
:max_redirects, :proxy, :
|
9
|
+
:max_redirects, :proxy, :proxy_username,:proxy_password,
|
10
|
+
:disable_ssl_peer_verification,
|
10
11
|
:ssl_cert, :ssl_cert_type, :ssl_key, :ssl_key_type,
|
11
12
|
:ssl_key_password, :ssl_cacert, :ssl_capath, :verbose,
|
12
|
-
:username, :password, :auth_method, :user_agent
|
13
|
+
:username, :password, :auth_method, :user_agent,
|
14
|
+
:proxy_auth_method, :proxy_type
|
13
15
|
|
14
16
|
# Initialize a new Request
|
15
17
|
#
|
@@ -52,6 +54,10 @@ module Typhoeus
|
|
52
54
|
@follow_location = options[:follow_location]
|
53
55
|
@max_redirects = options[:max_redirects]
|
54
56
|
@proxy = options[:proxy]
|
57
|
+
@proxy_type = options[:proxy_type]
|
58
|
+
@proxy_username = options[:proxy_username]
|
59
|
+
@proxy_password = options[:proxy_password]
|
60
|
+
@proxy_auth_method = options[:proxy_auth_method]
|
55
61
|
@disable_ssl_peer_verification = options[:disable_ssl_peer_verification]
|
56
62
|
@ssl_cert = options[:ssl_cert]
|
57
63
|
@ssl_cert_type = options[:ssl_cert_type]
|
@@ -78,8 +84,10 @@ module Typhoeus
|
|
78
84
|
@handled_response = nil
|
79
85
|
end
|
80
86
|
|
87
|
+
LOCALHOST_ALIASES = %w[ localhost 127.0.0.1 0.0.0.0 ]
|
88
|
+
|
81
89
|
def localhost?
|
82
|
-
|
90
|
+
LOCALHOST_ALIASES.include?(@parsed_uri.host)
|
83
91
|
end
|
84
92
|
|
85
93
|
def host
|
@@ -92,6 +100,10 @@ module Typhoeus
|
|
92
100
|
end
|
93
101
|
end
|
94
102
|
|
103
|
+
def host_domain
|
104
|
+
@parsed_uri.host
|
105
|
+
end
|
106
|
+
|
95
107
|
def headers
|
96
108
|
@headers["User-Agent"] = @user_agent
|
97
109
|
@headers
|
data/lib/typhoeus/response.rb
CHANGED
@@ -4,11 +4,17 @@ module Typhoeus
|
|
4
4
|
attr_reader :code, :headers, :body, :time,
|
5
5
|
:requested_url, :requested_remote_method,
|
6
6
|
:requested_http_method, :start_time,
|
7
|
-
:effective_url
|
7
|
+
:effective_url, :start_transfer_time,
|
8
|
+
:app_connect_time, :pretransfer_time,
|
9
|
+
:connect_time, :name_lookup_time,
|
10
|
+
:curl_return_code, :curl_error_message
|
11
|
+
|
8
12
|
attr_writer :headers_hash
|
9
13
|
|
10
14
|
def initialize(params = {})
|
11
15
|
@code = params[:code]
|
16
|
+
@curl_return_code = params[:curl_return_code]
|
17
|
+
@curl_error_message = params[:curl_error_message]
|
12
18
|
@status_message = params[:status_message]
|
13
19
|
@http_version = params[:http_version]
|
14
20
|
@headers = params[:headers] || ''
|
@@ -17,6 +23,11 @@ module Typhoeus
|
|
17
23
|
@requested_url = params[:requested_url]
|
18
24
|
@requested_http_method = params[:requested_http_method]
|
19
25
|
@start_time = params[:start_time]
|
26
|
+
@start_transfer_time = params[:start_transfer_time]
|
27
|
+
@app_connect_time = params[:app_connect_time]
|
28
|
+
@pretransfer_time = params[:pretransfer_time]
|
29
|
+
@connect_time = params[:connect_time]
|
30
|
+
@name_lookup_time = params[:name_lookup_time]
|
20
31
|
@request = params[:request]
|
21
32
|
@effective_url = params[:effective_url]
|
22
33
|
@mock = params[:mock] || false # default
|
@@ -67,6 +78,10 @@ module Typhoeus
|
|
67
78
|
@code != 304
|
68
79
|
end
|
69
80
|
|
81
|
+
def timed_out?
|
82
|
+
curl_return_code == 28
|
83
|
+
end
|
84
|
+
|
70
85
|
private
|
71
86
|
|
72
87
|
def first_header_line
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
This file is used to test uploading.
|
File without changes
|
data/spec/servers/app.rb
CHANGED
@@ -5,6 +5,15 @@ require 'json'
|
|
5
5
|
require 'zlib'
|
6
6
|
|
7
7
|
@@fail_count = 0
|
8
|
+
|
9
|
+
post '/file' do
|
10
|
+
{
|
11
|
+
'content-type' => params[:file][:type],
|
12
|
+
'filename' => params[:file][:filename],
|
13
|
+
'content' => params[:file][:tempfile].read
|
14
|
+
}.to_json
|
15
|
+
end
|
16
|
+
|
8
17
|
get '/fail/:number' do
|
9
18
|
if @@fail_count >= params[:number].to_i
|
10
19
|
"ok"
|
data/spec/spec.opts
CHANGED
data/spec/spec_helper.rb
CHANGED
data/spec/typhoeus/easy_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
describe Typhoeus::Easy do
|
4
4
|
describe "#supports_zlib" do
|
@@ -17,6 +17,42 @@ describe Typhoeus::Easy do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
describe "curl errors" do
|
21
|
+
it "should provide the CURLE_OPERATION_TIMEDOUT return code when a request times out" do
|
22
|
+
e = Typhoeus::Easy.new
|
23
|
+
e.url = "http://localhost:3001/?delay=1"
|
24
|
+
e.method = :get
|
25
|
+
e.timeout = 100
|
26
|
+
e.perform
|
27
|
+
e.curl_return_code.should == 28
|
28
|
+
e.curl_error_message.should == "Timeout was reached"
|
29
|
+
e.response_code.should == 0
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should provide the CURLE_COULDNT_CONNECT return code when trying to connect to a non existent port" do
|
33
|
+
e = Typhoeus::Easy.new
|
34
|
+
e.url = "http://localhost:3999"
|
35
|
+
e.method = :get
|
36
|
+
e.connect_timeout = 100
|
37
|
+
e.perform
|
38
|
+
e.curl_return_code.should == 7
|
39
|
+
e.curl_error_message.should == "Couldn't connect to server"
|
40
|
+
e.response_code.should == 0
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should not return an error message on a successful easy operation" do
|
44
|
+
easy = Typhoeus::Easy.new
|
45
|
+
easy.url = "http://localhost:3002"
|
46
|
+
easy.method = :get
|
47
|
+
easy.curl_error_message.should == nil
|
48
|
+
easy.perform
|
49
|
+
easy.response_code.should == 200
|
50
|
+
easy.curl_return_code.should == 0
|
51
|
+
easy.curl_error_message.should == "No error"
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
55
|
+
|
20
56
|
describe "options" do
|
21
57
|
it "should not follow redirects if not instructed to" do
|
22
58
|
e = Typhoeus::Easy.new
|
@@ -48,12 +84,11 @@ describe Typhoeus::Easy do
|
|
48
84
|
|
49
85
|
it "should provide a timeout in milliseconds" do
|
50
86
|
e = Typhoeus::Easy.new
|
51
|
-
e.url = "http://localhost:3001"
|
87
|
+
e.url = "http://localhost:3001/?delay=1"
|
52
88
|
e.method = :get
|
53
|
-
e.timeout =
|
89
|
+
e.timeout = 10
|
54
90
|
e.perform
|
55
|
-
|
56
|
-
# e.timed_out?.should == true
|
91
|
+
e.timed_out?.should == true
|
57
92
|
end
|
58
93
|
|
59
94
|
it "should allow the setting of the max redirects to follow" do
|
@@ -209,7 +244,21 @@ describe Typhoeus::Easy do
|
|
209
244
|
easy.params = {:foo => "bar"}
|
210
245
|
easy.perform
|
211
246
|
easy.response_code.should == 200
|
212
|
-
easy.response_body.should include("foo
|
247
|
+
easy.response_body.should include("name=\\\"foo\\\"\\r\\n\\r\\nbar")
|
248
|
+
end
|
249
|
+
|
250
|
+
it "should handle a file upload" do
|
251
|
+
easy = Typhoeus::Easy.new
|
252
|
+
easy.url = "http://localhost:3002/file"
|
253
|
+
easy.method = :post
|
254
|
+
easy.params = {:file => File.open(File.expand_path(File.dirname(__FILE__) + "/../fixtures/placeholder.txt"), "r")}
|
255
|
+
easy.perform
|
256
|
+
easy.response_code.should == 200
|
257
|
+
JSON.parse(easy.response_body).should == {
|
258
|
+
'content-type' => 'text/plain',
|
259
|
+
'filename' => 'placeholder.txt',
|
260
|
+
'content' => 'This file is used to test uploading.'
|
261
|
+
}
|
213
262
|
end
|
214
263
|
end
|
215
264
|
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
describe Typhoeus::Filter do
|
4
4
|
it "should take a method name and optionally take options" do
|
@@ -32,4 +32,4 @@ describe Typhoeus::Filter do
|
|
32
32
|
filter.apply_filter?(:foo).should be_false
|
33
33
|
end
|
34
34
|
end
|
35
|
-
end
|
35
|
+
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
|
+
|
3
|
+
describe Typhoeus::Form do
|
4
|
+
describe "#process!" do
|
5
|
+
it "should generate a valid form object" do
|
6
|
+
form = Typhoeus::Form.new({
|
7
|
+
:name => "John Smith",
|
8
|
+
:age => "29"
|
9
|
+
})
|
10
|
+
form.should_receive(:formadd_param).with("name", "John Smith")
|
11
|
+
form.should_receive(:formadd_param).with("age", "29")
|
12
|
+
form.process!
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should handle params that are a hash" do
|
16
|
+
form = Typhoeus::Form.new({
|
17
|
+
:attributes => {
|
18
|
+
:eyes => "brown",
|
19
|
+
:hair => "green",
|
20
|
+
:teeth => "white"
|
21
|
+
},
|
22
|
+
:name => "John Smith",
|
23
|
+
:age => "29"
|
24
|
+
})
|
25
|
+
form.should_receive(:formadd_param).with("attributes[eyes]", "brown")
|
26
|
+
form.should_receive(:formadd_param).with("attributes[hair]", "green")
|
27
|
+
form.should_receive(:formadd_param).with("attributes[teeth]", "white")
|
28
|
+
form.should_receive(:formadd_param).with("name", "John Smith")
|
29
|
+
form.should_receive(:formadd_param).with("age", "29")
|
30
|
+
form.process!
|
31
|
+
end
|
32
|
+
|
33
|
+
it "should params that have mutliple values" do
|
34
|
+
form = Typhoeus::Form.new({
|
35
|
+
:colors => ["brown", "green", "white"],
|
36
|
+
:name => "John Smith",
|
37
|
+
:age => "29"
|
38
|
+
})
|
39
|
+
form.should_receive(:formadd_param).with("colors", "brown")
|
40
|
+
form.should_receive(:formadd_param).with("colors", "green")
|
41
|
+
form.should_receive(:formadd_param).with("colors", "white")
|
42
|
+
form.should_receive(:formadd_param).with("name", "John Smith")
|
43
|
+
form.should_receive(:formadd_param).with("age", "29")
|
44
|
+
form.process!
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when a File object is a param" do
|
48
|
+
it "should handle one file" do
|
49
|
+
form = Typhoeus::Form.new(
|
50
|
+
:file => File.open(File.expand_path(File.dirname(__FILE__) + "/../fixtures/placeholder.txt"), "r")
|
51
|
+
)
|
52
|
+
form.should_receive(:formadd_file).with("file", "placeholder.txt", "text/plain", anything)
|
53
|
+
form.process!
|
54
|
+
end
|
55
|
+
it "should handle more than one file" do
|
56
|
+
form = Typhoeus::Form.new(
|
57
|
+
:text_file => File.open(File.expand_path(File.dirname(__FILE__) + "/../fixtures/placeholder.txt"), "r"),
|
58
|
+
:gif_file => File.open(File.expand_path(File.dirname(__FILE__) + "/../fixtures/placeholder.gif"), "r")
|
59
|
+
)
|
60
|
+
form.should_receive(:formadd_file).with("text_file", "placeholder.txt", "text/plain", anything)
|
61
|
+
form.should_receive(:formadd_file).with("gif_file", "placeholder.gif", "image/gif", anything)
|
62
|
+
form.process!
|
63
|
+
end
|
64
|
+
it "should default to 'application/octet-stream' if no content type can be determined" do
|
65
|
+
pending
|
66
|
+
form = Typhoeus::Form.new(
|
67
|
+
:file => File.open(File.expand_path(File.dirname(__FILE__) + "/../fixtures/placeholder.txt"), "r")
|
68
|
+
)
|
69
|
+
form.should_receive(:formadd_file).with("file", "placeholder.ukn", "application/octet-stream", anything)
|
70
|
+
form.process!
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "#to_s" do
|
76
|
+
it "should generate a valid query string" do
|
77
|
+
form = Typhoeus::Form.new({
|
78
|
+
:name => "John Smith",
|
79
|
+
:age => "29"
|
80
|
+
})
|
81
|
+
form.to_s.should == "age=29&name=John+Smith"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should handle params that are a hash" do
|
85
|
+
form = Typhoeus::Form.new({
|
86
|
+
:attributes => {
|
87
|
+
:eyes => "brown",
|
88
|
+
:hair => "green",
|
89
|
+
:teeth => "white"
|
90
|
+
},
|
91
|
+
:name => "John Smith",
|
92
|
+
:age => "29"
|
93
|
+
})
|
94
|
+
form.to_s.should == "age=29&attributes%5Beyes%5D=brown&attributes%5Bhair%5D=green&attributes%5Bteeth%5D=white&name=John+Smith"
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should params that have mutliple values" do
|
98
|
+
form = Typhoeus::Form.new({
|
99
|
+
:colors => ["brown", "green", "white"],
|
100
|
+
:name => "John Smith",
|
101
|
+
:age => "29"
|
102
|
+
})
|
103
|
+
form.to_s.should == "age=29&colors=brown&colors=green&colors=white&name=John+Smith"
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
data/spec/typhoeus/hydra_spec.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.dirname(__FILE__) + '/../spec_helper'
|
1
|
+
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
2
|
|
3
3
|
# some of these tests assume that you have some local services running.
|
4
4
|
# ruby spec/servers/app.rb -p 3000
|
@@ -46,6 +46,47 @@ describe Typhoeus::Hydra do
|
|
46
46
|
second.response.body.should include("second")
|
47
47
|
end
|
48
48
|
|
49
|
+
it "should store the curl return codes on the reponses" do
|
50
|
+
hydra = Typhoeus::Hydra.new
|
51
|
+
first = Typhoeus::Request.new("http://localhost:3001/?delay=1", :timeout => 100)
|
52
|
+
second = Typhoeus::Request.new("http://localhost:3999", :connect_timout => 100)
|
53
|
+
hydra.queue first
|
54
|
+
hydra.queue second
|
55
|
+
hydra.run
|
56
|
+
first.response.curl_return_code == 28
|
57
|
+
second.response.curl_return_code == 7
|
58
|
+
end
|
59
|
+
|
60
|
+
it "aborts a batch of requests" do
|
61
|
+
urls = [
|
62
|
+
'http://localhost:3000',
|
63
|
+
'http://localhost:3001',
|
64
|
+
'http://localhost:3002'
|
65
|
+
]
|
66
|
+
|
67
|
+
# this will make testing easier
|
68
|
+
hydra = Typhoeus::Hydra.new( :max_concurrency => 1 )
|
69
|
+
completed = 0
|
70
|
+
|
71
|
+
10.times {
|
72
|
+
|i|
|
73
|
+
|
74
|
+
req = Typhoeus::Request.new( urls[ i % urls.size], :params => { :cnt => i } )
|
75
|
+
req.on_complete {
|
76
|
+
|res|
|
77
|
+
completed += 1
|
78
|
+
hydra.abort if completed == 5
|
79
|
+
}
|
80
|
+
|
81
|
+
hydra.queue( req )
|
82
|
+
}
|
83
|
+
|
84
|
+
hydra.run
|
85
|
+
|
86
|
+
# technically this should be '== 6' but I don't trust it...
|
87
|
+
completed.should < 10
|
88
|
+
end
|
89
|
+
|
49
90
|
it "has a cache_setter proc" do
|
50
91
|
hydra = Typhoeus::Hydra.new
|
51
92
|
hydra.cache_setter do |request|
|
@@ -390,37 +431,77 @@ describe Typhoeus::Hydra::ConnectOptions do
|
|
390
431
|
@klass = Typhoeus::Hydra
|
391
432
|
end
|
392
433
|
|
434
|
+
let!(:old_net_connect) { @klass.allow_net_connect }
|
435
|
+
let!(:old_ignore_localhost) { @klass.ignore_localhost }
|
436
|
+
let(:hydra) { @klass.new }
|
437
|
+
|
438
|
+
after(:each) do
|
439
|
+
@klass.allow_net_connect = old_net_connect
|
440
|
+
@klass.ignore_localhost = old_ignore_localhost
|
441
|
+
end
|
442
|
+
|
443
|
+
def request_for(host)
|
444
|
+
Typhoeus::Request.new("http://#{host}:3000")
|
445
|
+
end
|
446
|
+
|
393
447
|
describe "#ignore_localhost" do
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
448
|
+
context "when set to true" do
|
449
|
+
before(:each) { @klass.ignore_localhost = true }
|
450
|
+
|
451
|
+
[true, false].each do |val|
|
452
|
+
it "allows localhost requests when allow_net_connect is #{val}" do
|
453
|
+
@klass.allow_net_connect = val
|
454
|
+
expect { hydra.queue(request_for('localhost')) }.to_not raise_error
|
455
|
+
end
|
456
|
+
end
|
457
|
+
end
|
458
|
+
|
459
|
+
context "when set to false" do
|
460
|
+
before(:each) { @klass.ignore_localhost = false }
|
461
|
+
|
462
|
+
it "allows localhost requests when allow_net_connect is true" do
|
463
|
+
@klass.allow_net_connect = true
|
464
|
+
expect { hydra.queue(request_for('localhost')) }.to_not raise_error
|
465
|
+
end
|
466
|
+
|
467
|
+
it "does not allow localhost requests when allow_net_connect is false" do
|
398
468
|
@klass.allow_net_connect = false
|
399
|
-
|
469
|
+
expect { hydra.queue(request_for('localhost')) }.to raise_error(Typhoeus::Hydra::NetConnectNotAllowedError)
|
470
|
+
end
|
471
|
+
end
|
472
|
+
end
|
400
473
|
|
401
|
-
|
402
|
-
|
474
|
+
describe "#ignore_hosts" do
|
475
|
+
context 'when allow_net_connect is set to false' do
|
476
|
+
before(:each) do
|
477
|
+
@klass.ignore_localhost = false
|
478
|
+
@klass.allow_net_connect = false
|
479
|
+
end
|
403
480
|
|
404
|
-
|
405
|
-
|
406
|
-
|
407
|
-
|
408
|
-
|
409
|
-
|
481
|
+
Typhoeus::Request::LOCALHOST_ALIASES.each do |disallowed_host|
|
482
|
+
ignore_hosts = Typhoeus::Request::LOCALHOST_ALIASES - [disallowed_host]
|
483
|
+
|
484
|
+
context "when set to #{ignore_hosts.join(' and ')}" do
|
485
|
+
before(:each) { @klass.ignore_hosts = ignore_hosts }
|
486
|
+
|
487
|
+
it "does not allow a request to #{disallowed_host}" do
|
488
|
+
expect { hydra.queue(request_for(disallowed_host)) }.to raise_error(Typhoeus::Hydra::NetConnectNotAllowedError)
|
489
|
+
end
|
490
|
+
|
491
|
+
ignore_hosts.each do |host|
|
492
|
+
it "allows a request to #{host}" do
|
493
|
+
expect { hydra.queue(request_for(host)) }.to_not raise_error
|
494
|
+
end
|
495
|
+
end
|
496
|
+
end
|
410
497
|
end
|
411
498
|
end
|
412
499
|
end
|
413
500
|
|
414
501
|
describe "#allow_net_connect" do
|
415
502
|
it "should be settable" do
|
416
|
-
|
417
|
-
|
418
|
-
old = @klass.allow_net_connect
|
419
|
-
@klass.allow_net_connect = true
|
420
|
-
@klass.allow_net_connect.should be_true
|
421
|
-
ensure
|
422
|
-
@klass.allow_net_connect = old
|
423
|
-
end
|
503
|
+
@klass.allow_net_connect = true
|
504
|
+
@klass.allow_net_connect.should be_true
|
424
505
|
end
|
425
506
|
|
426
507
|
it "should default to true" do
|
@@ -428,23 +509,12 @@ describe Typhoeus::Hydra::ConnectOptions do
|
|
428
509
|
end
|
429
510
|
|
430
511
|
it "should raise an error if we queue a request while its false" do
|
431
|
-
|
432
|
-
|
433
|
-
old_net_connect = @klass.allow_net_connect
|
434
|
-
old_ignore_localhost = @klass.ignore_localhost
|
512
|
+
@klass.allow_net_connect = false
|
513
|
+
@klass.ignore_localhost = false
|
435
514
|
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
hydra = Typhoeus::Hydra.new
|
440
|
-
|
441
|
-
lambda {
|
442
|
-
hydra.queue(request)
|
443
|
-
}.should raise_error(Typhoeus::Hydra::NetConnectNotAllowedError)
|
444
|
-
ensure
|
445
|
-
@klass.allow_net_connect = old_net_connect
|
446
|
-
@klass.ignore_localhost = old_ignore_localhost
|
447
|
-
end
|
515
|
+
expect {
|
516
|
+
hydra.queue(request_for('example.com'))
|
517
|
+
}.to raise_error(Typhoeus::Hydra::NetConnectNotAllowedError)
|
448
518
|
end
|
449
519
|
end
|
450
520
|
|