typhoeus 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.markdown +7 -1
- data/Gemfile.lock +3 -1
- data/Rakefile +21 -31
- data/ext/typhoeus/typhoeus_multi.c +1 -1
- data/lib/typhoeus/easy.rb +33 -7
- data/lib/typhoeus/hydra.rb +1 -0
- data/lib/typhoeus/request.rb +56 -16
- data/lib/typhoeus/version.rb +1 -1
- data/spec/servers/app.rb +2 -3
- data/spec/spec_helper.rb +5 -0
- data/spec/support/typhoeus_localhost_server.rb +58 -0
- data/spec/typhoeus/easy_spec.rb +54 -15
- data/spec/typhoeus/hydra_mock_spec.rb +6 -6
- data/spec/typhoeus/hydra_spec.rb +1 -1
- data/typhoeus.gemspec +1 -0
- metadata +19 -4
data/CHANGELOG.markdown
CHANGED
@@ -1,4 +1,10 @@
|
|
1
|
-
0.3.
|
1
|
+
0.3.3
|
2
|
+
--------------
|
3
|
+
* Make sure to call the Easy::failure callback on all non-success http response codes, even invalid ones. [balexis]
|
4
|
+
* Use bytesize instead of length to determine Content-Length [dlamacchia]
|
5
|
+
* Added SSL version option to Easy/Request [michelbarbosa/dbalatero]
|
6
|
+
|
7
|
+
0.3.2
|
2
8
|
-----
|
3
9
|
* Fix array params to be consistent with HTTP spec [gridaphobe]
|
4
10
|
* traversal_to_params_hash should use the escape option [itsmeduncan]
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
typhoeus (0.3.
|
4
|
+
typhoeus (0.3.2)
|
5
5
|
mime-types
|
6
6
|
|
7
7
|
GEM
|
@@ -11,6 +11,7 @@ GEM
|
|
11
11
|
json (1.5.3)
|
12
12
|
mime-types (1.16)
|
13
13
|
rack (1.3.0)
|
14
|
+
rake (0.9.2)
|
14
15
|
rspec (2.6.0)
|
15
16
|
rspec-core (~> 2.6.0)
|
16
17
|
rspec-expectations (~> 2.6.0)
|
@@ -30,6 +31,7 @@ PLATFORMS
|
|
30
31
|
DEPENDENCIES
|
31
32
|
diff-lcs
|
32
33
|
json
|
34
|
+
rake
|
33
35
|
rspec (~> 2.6)
|
34
36
|
sinatra
|
35
37
|
typhoeus!
|
data/Rakefile
CHANGED
@@ -1,29 +1,5 @@
|
|
1
1
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
2
2
|
|
3
|
-
require "lib/typhoeus/version"
|
4
|
-
|
5
|
-
begin
|
6
|
-
require 'jeweler'
|
7
|
-
Jeweler::Tasks.new do |gemspec|
|
8
|
-
gemspec.name = "typhoeus"
|
9
|
-
gemspec.summary = "A library for interacting with web services (and building SOAs) at blinding speed."
|
10
|
-
gemspec.description = "Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic."
|
11
|
-
gemspec.email = "dbalatero@gmail.com"
|
12
|
-
gemspec.homepage = "http://github.com/dbalatero/typhoeus"
|
13
|
-
gemspec.authors = ["Paul Dix", "David Balatero"]
|
14
|
-
gemspec.add_dependency "mime-types"
|
15
|
-
gemspec.add_development_dependency "rspec", "~> 2.6"
|
16
|
-
gemspec.add_development_dependency "jeweler"
|
17
|
-
gemspec.add_development_dependency "diff-lcs"
|
18
|
-
gemspec.add_development_dependency "sinatra"
|
19
|
-
gemspec.add_development_dependency "json"
|
20
|
-
end
|
21
|
-
|
22
|
-
Jeweler::GemcutterTasks.new
|
23
|
-
rescue LoadError
|
24
|
-
puts "Jeweler not available. Install it with: gem install jeweler"
|
25
|
-
end
|
26
|
-
|
27
3
|
require 'rspec/core/rake_task'
|
28
4
|
RSpec::Core::RakeTask.new do |t|
|
29
5
|
end
|
@@ -36,18 +12,32 @@ end
|
|
36
12
|
|
37
13
|
desc "Builds the native code"
|
38
14
|
task :build_native do
|
39
|
-
system("cd ext/typhoeus && ruby extconf.rb && make")
|
15
|
+
system("cd ext/typhoeus && ruby extconf.rb && make clean && make")
|
40
16
|
end
|
41
17
|
|
42
18
|
desc "Start up the test servers"
|
43
19
|
task :start_test_servers do
|
44
20
|
puts "Starting 3 test servers"
|
45
|
-
|
46
|
-
|
47
|
-
|
21
|
+
|
22
|
+
pids = []
|
23
|
+
[3000, 3001, 3002].each do |port|
|
24
|
+
if pid = fork
|
25
|
+
pids << pid
|
26
|
+
else
|
27
|
+
exec('ruby', 'spec/servers/app.rb', '-p', port.to_s)
|
48
28
|
end
|
49
|
-
end
|
29
|
+
end
|
30
|
+
|
31
|
+
at_exit do
|
32
|
+
pids.each do |pid|
|
33
|
+
puts "Killing pid #{pid}"
|
34
|
+
Process.kill("KILL", pid)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
# Wait for kill.
|
39
|
+
sleep
|
50
40
|
end
|
51
41
|
|
52
|
-
desc "
|
53
|
-
task :default => :spec
|
42
|
+
desc "Build Typhoeus and run all the tests."
|
43
|
+
task :default => [:build_native, :spec]
|
@@ -92,7 +92,7 @@ static void multi_read_info(VALUE self, CURLM *multi_handle) {
|
|
92
92
|
else if ((response_code >= 200 && response_code < 300) || response_code == 0) {
|
93
93
|
rb_funcall(easy, rb_intern("success"), 0);
|
94
94
|
}
|
95
|
-
else
|
95
|
+
else {
|
96
96
|
rb_funcall(easy, rb_intern("failure"), 0);
|
97
97
|
}
|
98
98
|
}
|
data/lib/typhoeus/easy.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Typhoeus
|
2
2
|
class Easy
|
3
|
-
attr_reader :response_body, :response_header, :method, :headers, :url, :params, :curl_return_code
|
3
|
+
attr_reader :response_body, :response_header, :method, :headers, :url, :params, :curl_return_code, :ssl_version
|
4
4
|
attr_accessor :start_time
|
5
5
|
|
6
6
|
# These integer codes are available in curl/curl.h
|
@@ -40,6 +40,7 @@ module Typhoeus
|
|
40
40
|
:CURLOPT_SSLCERTTYPE => 10086,
|
41
41
|
:CURLOPT_SSLKEY => 10087,
|
42
42
|
:CURLOPT_SSLKEYTYPE => 10088,
|
43
|
+
:CURLOPT_SSLVERSION => 32,
|
43
44
|
:CURLOPT_KEYPASSWD => 10026,
|
44
45
|
:CURLOPT_CAINFO => 10065,
|
45
46
|
:CURLOPT_CAPATH => 10097,
|
@@ -73,6 +74,16 @@ module Typhoeus
|
|
73
74
|
:CURLPROXY_SOCKS4A => 6,
|
74
75
|
}
|
75
76
|
|
77
|
+
SSL_VERSIONS = {
|
78
|
+
:CURL_SSLVERSION_DEFAULT => 0,
|
79
|
+
:CURL_SSLVERSION_TLSv1 => 1,
|
80
|
+
:CURL_SSLVERSION_SSLv2 => 2,
|
81
|
+
:CURL_SSLVERSION_SSLv3 => 3,
|
82
|
+
:default => 0,
|
83
|
+
:tlsv1 => 1,
|
84
|
+
:sslv2 => 2,
|
85
|
+
:sslv3 => 3
|
86
|
+
}
|
76
87
|
|
77
88
|
def initialize
|
78
89
|
@method = :get
|
@@ -83,13 +94,26 @@ module Typhoeus
|
|
83
94
|
|
84
95
|
def set_defaults
|
85
96
|
# Enable encoding/compression support
|
86
|
-
|
97
|
+
self.encoding = ''
|
98
|
+
self.ssl_version = :default
|
99
|
+
end
|
100
|
+
|
101
|
+
def encoding=(encoding)
|
102
|
+
# Enable encoding/compression support
|
103
|
+
set_option(OPTION_VALUES[:CURLOPT_ENCODING], encoding)
|
104
|
+
end
|
105
|
+
|
106
|
+
def ssl_version=(version)
|
107
|
+
raise "Invalid SSL version: '#{version}' supplied! Please supply one as listed in Typhoeus::Easy::SSL_VERSIONS" unless SSL_VERSIONS.has_key?(version)
|
108
|
+
@ssl_version = version
|
109
|
+
|
110
|
+
set_option(OPTION_VALUES[:CURLOPT_SSLVERSION], SSL_VERSIONS[version])
|
87
111
|
end
|
88
112
|
|
89
113
|
def headers=(hash)
|
90
114
|
@headers = hash
|
91
115
|
end
|
92
|
-
|
116
|
+
|
93
117
|
def interface=(interface)
|
94
118
|
@interface = interface
|
95
119
|
set_option(OPTION_VALUES[:CURLOPT_INTERFACE], interface)
|
@@ -145,7 +169,7 @@ module Typhoeus
|
|
145
169
|
def effective_url
|
146
170
|
get_info_string(INFO_VALUES[:CURLINFO_EFFECTIVE_URL])
|
147
171
|
end
|
148
|
-
|
172
|
+
|
149
173
|
def primary_ip
|
150
174
|
get_info_string(INFO_VALUES[:CURLINFO_PRIMARY_IP])
|
151
175
|
end
|
@@ -231,7 +255,7 @@ module Typhoeus
|
|
231
255
|
|
232
256
|
def post_data=(data)
|
233
257
|
@post_data_set = true
|
234
|
-
set_option(OPTION_VALUES[:CURLOPT_POSTFIELDSIZE], data.
|
258
|
+
set_option(OPTION_VALUES[:CURLOPT_POSTFIELDSIZE], data.bytesize)
|
235
259
|
set_option(OPTION_VALUES[:CURLOPT_COPYPOSTFIELDS], data)
|
236
260
|
end
|
237
261
|
|
@@ -332,7 +356,8 @@ module Typhoeus
|
|
332
356
|
easy_set_headers() unless headers.empty?
|
333
357
|
end
|
334
358
|
|
335
|
-
# gets called when finished and response code is
|
359
|
+
# gets called when finished and response code is not 2xx,
|
360
|
+
# or curl returns an error code.
|
336
361
|
def success
|
337
362
|
@success.call(self) if @success
|
338
363
|
end
|
@@ -345,7 +370,8 @@ module Typhoeus
|
|
345
370
|
@success = block
|
346
371
|
end
|
347
372
|
|
348
|
-
# gets called when finished and response code is 300-599
|
373
|
+
# gets called when finished and response code is 300-599
|
374
|
+
# or curl returns an error code
|
349
375
|
def failure
|
350
376
|
@failure.call(self) if @failure
|
351
377
|
end
|
data/lib/typhoeus/hydra.rb
CHANGED
@@ -178,6 +178,7 @@ module Typhoeus
|
|
178
178
|
easy.ssl_key_password = request.ssl_key_password
|
179
179
|
easy.ssl_cacert = request.ssl_cacert
|
180
180
|
easy.ssl_capath = request.ssl_capath
|
181
|
+
easy.ssl_version = request.ssl_version || :default
|
181
182
|
easy.verbose = request.verbose
|
182
183
|
|
183
184
|
easy.on_success do |easy|
|
data/lib/typhoeus/request.rb
CHANGED
@@ -2,16 +2,43 @@ require 'uri'
|
|
2
2
|
|
3
3
|
module Typhoeus
|
4
4
|
class Request
|
5
|
+
ACCESSOR_OPTIONS = [
|
6
|
+
:method,
|
7
|
+
:params,
|
8
|
+
:body,
|
9
|
+
:headers,
|
10
|
+
:connect_timeout,
|
11
|
+
:timeout,
|
12
|
+
:user_agent,
|
13
|
+
:response,
|
14
|
+
:cache_timeout,
|
15
|
+
:follow_location,
|
16
|
+
:max_redirects,
|
17
|
+
:proxy,
|
18
|
+
:proxy_username,
|
19
|
+
:proxy_password,
|
20
|
+
:disable_ssl_peer_verification,
|
21
|
+
:disable_ssl_host_verification,
|
22
|
+
:interface,
|
23
|
+
:ssl_cert,
|
24
|
+
:ssl_cert_type,
|
25
|
+
:ssl_key,
|
26
|
+
:ssl_key_type,
|
27
|
+
:ssl_key_password,
|
28
|
+
:ssl_cacert,
|
29
|
+
:ssl_capath,
|
30
|
+
:ssl_version,
|
31
|
+
:verbose,
|
32
|
+
:username,
|
33
|
+
:password,
|
34
|
+
:auth_method,
|
35
|
+
:user_agent,
|
36
|
+
:proxy_auth_method,
|
37
|
+
:proxy_type
|
38
|
+
]
|
39
|
+
|
5
40
|
attr_reader :url
|
6
|
-
|
7
|
-
attr_accessor :method, :params, :body, :connect_timeout, :timeout,
|
8
|
-
:user_agent, :response, :cache_timeout, :follow_location,
|
9
|
-
:max_redirects, :proxy, :proxy_username,:proxy_password,
|
10
|
-
:disable_ssl_peer_verification, :disable_ssl_host_verification, :interface,
|
11
|
-
:ssl_cert, :ssl_cert_type, :ssl_key, :ssl_key_type,
|
12
|
-
:ssl_key_password, :ssl_cacert, :ssl_capath, :verbose,
|
13
|
-
:username, :password, :auth_method, :user_agent,
|
14
|
-
:proxy_auth_method, :proxy_type
|
41
|
+
attr_accessor *ACCESSOR_OPTIONS
|
15
42
|
|
16
43
|
# Initialize a new Request
|
17
44
|
#
|
@@ -25,7 +52,6 @@ module Typhoeus
|
|
25
52
|
# ** +:interface+ : interface or ip address (string)
|
26
53
|
# ** +:connect_timeout+ : connect timeout (ms)
|
27
54
|
# ** +:headers+ : headers as Hash
|
28
|
-
# ** +:user_agent+ : user agent (string)
|
29
55
|
# ** +:cache_timeout+ : cache timeout (ms)
|
30
56
|
# ** +:follow_location
|
31
57
|
# ** +:max_redirects
|
@@ -43,6 +69,7 @@ module Typhoeus
|
|
43
69
|
# ** +:username
|
44
70
|
# ** +:password
|
45
71
|
# ** +:auth_method
|
72
|
+
# ** +:user_agent+ : user agent (string) - DEPRECATED
|
46
73
|
#
|
47
74
|
def initialize(url, options = {})
|
48
75
|
@method = options[:method] || :get
|
@@ -52,7 +79,11 @@ module Typhoeus
|
|
52
79
|
@connect_timeout = safe_to_i(options[:connect_timeout])
|
53
80
|
@interface = options[:interface]
|
54
81
|
@headers = options[:headers] || {}
|
55
|
-
|
82
|
+
|
83
|
+
if options.has_key?(:user_agent)
|
84
|
+
self.user_agent = options[:user_agent]
|
85
|
+
end
|
86
|
+
|
56
87
|
@cache_timeout = safe_to_i(options[:cache_timeout])
|
57
88
|
@follow_location = options[:follow_location]
|
58
89
|
@max_redirects = options[:max_redirects]
|
@@ -70,6 +101,7 @@ module Typhoeus
|
|
70
101
|
@ssl_key_password = options[:ssl_key_password]
|
71
102
|
@ssl_cacert = options[:ssl_cacert]
|
72
103
|
@ssl_capath = options[:ssl_capath]
|
104
|
+
@ssl_version = options[:ssl_version]
|
73
105
|
@verbose = options[:verbose]
|
74
106
|
@username = options[:username]
|
75
107
|
@password = options[:password]
|
@@ -94,6 +126,15 @@ module Typhoeus
|
|
94
126
|
LOCALHOST_ALIASES.include?(@parsed_uri.host)
|
95
127
|
end
|
96
128
|
|
129
|
+
def user_agent
|
130
|
+
headers['User-Agent']
|
131
|
+
end
|
132
|
+
|
133
|
+
def user_agent=(value)
|
134
|
+
puts "DEPRECATED: Typhoeus::Request#user_agent=(value). This will be removed in a later version."
|
135
|
+
headers['User-Agent'] = value
|
136
|
+
end
|
137
|
+
|
97
138
|
def host
|
98
139
|
slash_location = @url.index('/', 8)
|
99
140
|
if slash_location
|
@@ -108,11 +149,6 @@ module Typhoeus
|
|
108
149
|
@parsed_uri.host
|
109
150
|
end
|
110
151
|
|
111
|
-
def headers
|
112
|
-
@headers["User-Agent"] = @user_agent
|
113
|
-
@headers
|
114
|
-
end
|
115
|
-
|
116
152
|
def params_string
|
117
153
|
traversal = Typhoeus::Utils.traverse_params_hash(params)
|
118
154
|
Typhoeus::Utils.traversal_to_param_string(traversal)
|
@@ -217,6 +253,10 @@ module Typhoeus
|
|
217
253
|
attributes.each { |name, value| instance_variable_set(name, value) }
|
218
254
|
end
|
219
255
|
|
256
|
+
def self.options
|
257
|
+
ACCESSOR_OPTIONS
|
258
|
+
end
|
259
|
+
|
220
260
|
private
|
221
261
|
|
222
262
|
def safe_to_i(value)
|
data/lib/typhoeus/version.rb
CHANGED
data/spec/servers/app.rb
CHANGED
@@ -4,6 +4,8 @@ require 'sinatra'
|
|
4
4
|
require 'json'
|
5
5
|
require 'zlib'
|
6
6
|
|
7
|
+
set :logging, false
|
8
|
+
|
7
9
|
@@fail_count = 0
|
8
10
|
|
9
11
|
post '/file' do
|
@@ -83,16 +85,13 @@ head '/**' do
|
|
83
85
|
end
|
84
86
|
|
85
87
|
put '/**' do
|
86
|
-
puts request.inspect
|
87
88
|
request.env.merge!(:body => request.body.read).to_json
|
88
89
|
end
|
89
90
|
|
90
91
|
post '/**' do
|
91
|
-
puts request.inspect
|
92
92
|
request.env.merge!(:body => request.body.read).to_json
|
93
93
|
end
|
94
94
|
|
95
95
|
delete '/**' do
|
96
|
-
puts request.inspect
|
97
96
|
request.env.merge!(:body => request.body.read).to_json
|
98
97
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -10,5 +10,10 @@ $LOAD_PATH.unshift(path) unless $LOAD_PATH.include?(path)
|
|
10
10
|
|
11
11
|
require path + '/typhoeus'
|
12
12
|
|
13
|
+
Dir['./spec/support/**/*.rb'].each { |f| require f }
|
14
|
+
|
13
15
|
RSpec.configure do |config|
|
16
|
+
config.before(:suite) do
|
17
|
+
TyphoeusLocalhostServer.start_servers!
|
18
|
+
end
|
14
19
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'uri'
|
3
|
+
|
4
|
+
class TyphoeusLocalhostServer
|
5
|
+
class << self
|
6
|
+
attr_accessor :pid
|
7
|
+
|
8
|
+
def start_servers!
|
9
|
+
if self.pid = fork
|
10
|
+
start_parent
|
11
|
+
wait_for_servers_to_start
|
12
|
+
else
|
13
|
+
start_child
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def start_parent
|
20
|
+
# Cleanup.
|
21
|
+
at_exit do
|
22
|
+
Process.kill('QUIT', self.pid) if self.pid
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def start_child
|
27
|
+
exec('rake', 'start_test_servers')
|
28
|
+
end
|
29
|
+
|
30
|
+
def wait_for_servers_to_start
|
31
|
+
puts "Waiting for servers to start..."
|
32
|
+
ports = [3000, 3001, 3002]
|
33
|
+
|
34
|
+
Timeout::timeout(10) do
|
35
|
+
loop do
|
36
|
+
up = 0
|
37
|
+
ports.each do |port|
|
38
|
+
url = "http://localhost:#{port}/"
|
39
|
+
begin
|
40
|
+
response = Net::HTTP.get_response(URI.parse(url))
|
41
|
+
if response.is_a?(Net::HTTPSuccess)
|
42
|
+
up += 1
|
43
|
+
end
|
44
|
+
rescue SystemCallError => error
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
if up == ports.size
|
49
|
+
puts "Servers are up!"
|
50
|
+
break
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
rescue Timeout::Error => error
|
55
|
+
abort "Servers never started!"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
data/spec/typhoeus/easy_spec.rb
CHANGED
@@ -1,6 +1,37 @@
|
|
1
|
+
# encoding: UTF-8
|
1
2
|
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
|
2
3
|
|
4
|
+
if defined?(Encoding)
|
5
|
+
Encoding.default_internal = 'utf-8'
|
6
|
+
Encoding.default_external = 'utf-8'
|
7
|
+
end
|
8
|
+
|
3
9
|
describe Typhoeus::Easy do
|
10
|
+
describe "ssl_version" do
|
11
|
+
before(:each) do
|
12
|
+
@easy = Typhoeus::Easy.new
|
13
|
+
@easy.url = "http://localhost:3000"
|
14
|
+
@easy.method = :get
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should allow to set the SSL version to be used" do
|
18
|
+
Typhoeus::Easy::SSL_VERSIONS.each do |k, v|
|
19
|
+
@easy.ssl_version = k
|
20
|
+
@easy.perform
|
21
|
+
@easy.response_code.should == 200
|
22
|
+
@easy.ssl_version.should == k
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "complains when an incorrect SSL version is used" do
|
27
|
+
expect { @easy.ssl_version = 'bogus' }.to raise_error
|
28
|
+
end
|
29
|
+
|
30
|
+
it "uses the default SSL version if nothing is supplied" do
|
31
|
+
@easy.ssl_version.should == :default
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
4
35
|
describe "#supports_zlib" do
|
5
36
|
before(:each) do
|
6
37
|
@easy = Typhoeus::Easy.new
|
@@ -76,7 +107,7 @@ describe Typhoeus::Easy do
|
|
76
107
|
e = Typhoeus::Easy.new
|
77
108
|
e.url = "http://localhost:3002"
|
78
109
|
e.method = :get
|
79
|
-
e.
|
110
|
+
e.headers['User-Agent'] = 'myapp'
|
80
111
|
e.perform
|
81
112
|
e.response_code.should == 200
|
82
113
|
JSON.parse(e.response_body)["HTTP_USER_AGENT"].should == "myapp"
|
@@ -120,7 +151,7 @@ describe Typhoeus::Easy do
|
|
120
151
|
e.primary_ip.should == "127.0.0.1"
|
121
152
|
end
|
122
153
|
end
|
123
|
-
|
154
|
+
|
124
155
|
describe "authentication" do
|
125
156
|
it "should allow to set username and password" do
|
126
157
|
e = Typhoeus::Easy.new
|
@@ -131,7 +162,7 @@ describe Typhoeus::Easy do
|
|
131
162
|
e.perform
|
132
163
|
e.response_code.should == 200
|
133
164
|
end
|
134
|
-
|
165
|
+
|
135
166
|
it "should allow to query auth methods support by the server" do
|
136
167
|
e = Typhoeus::Easy.new
|
137
168
|
e.url = "http://localhost:3001/auth_basic/foo/bar"
|
@@ -149,7 +180,7 @@ describe Typhoeus::Easy do
|
|
149
180
|
e.response_code.should == 200
|
150
181
|
end
|
151
182
|
end
|
152
|
-
|
183
|
+
|
153
184
|
describe "get" do
|
154
185
|
it "should perform a get" do
|
155
186
|
easy = Typhoeus::Easy.new
|
@@ -213,7 +244,7 @@ describe Typhoeus::Easy do
|
|
213
244
|
easy.response_code.should == 200
|
214
245
|
JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "PUT"
|
215
246
|
end
|
216
|
-
|
247
|
+
|
217
248
|
it "should send a request body" do
|
218
249
|
easy = Typhoeus::Easy.new
|
219
250
|
easy.url = "http://localhost:3002"
|
@@ -241,8 +272,17 @@ describe Typhoeus::Easy do
|
|
241
272
|
JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "PUT"
|
242
273
|
end
|
243
274
|
|
275
|
+
it "should set content length correctly for a utf-8 string" do
|
276
|
+
body = "this is a body with utf-8 content: Motörhead! WHÖÖ!"
|
277
|
+
easy = Typhoeus::Easy.new
|
278
|
+
easy.url = "http://localhost:3002"
|
279
|
+
easy.method = :post
|
280
|
+
easy.should_receive(:set_option).with(Typhoeus::Easy::OPTION_VALUES[:CURLOPT_POSTFIELDSIZE], 55)
|
281
|
+
easy.should_receive(:set_option).with(Typhoeus::Easy::OPTION_VALUES[:CURLOPT_COPYPOSTFIELDS], body)
|
282
|
+
easy.request_body = body
|
283
|
+
end
|
244
284
|
end
|
245
|
-
|
285
|
+
|
246
286
|
describe "post" do
|
247
287
|
it "should perform a post" do
|
248
288
|
easy = Typhoeus::Easy.new
|
@@ -252,7 +292,7 @@ describe Typhoeus::Easy do
|
|
252
292
|
easy.response_code.should == 200
|
253
293
|
JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "POST"
|
254
294
|
end
|
255
|
-
|
295
|
+
|
256
296
|
it "should send a request body" do
|
257
297
|
easy = Typhoeus::Easy.new
|
258
298
|
easy.url = "http://localhost:3002"
|
@@ -262,7 +302,7 @@ describe Typhoeus::Easy do
|
|
262
302
|
easy.response_code.should == 200
|
263
303
|
easy.response_body.should include("this is a body!")
|
264
304
|
end
|
265
|
-
|
305
|
+
|
266
306
|
it "should handle params" do
|
267
307
|
easy = Typhoeus::Easy.new
|
268
308
|
easy.url = "http://localhost:3002"
|
@@ -282,7 +322,7 @@ describe Typhoeus::Easy do
|
|
282
322
|
easy.perform
|
283
323
|
|
284
324
|
request = JSON.parse(easy.response_body)
|
285
|
-
request['CONTENT_TYPE'].should == 'application/x-www-form-urlencoded'
|
325
|
+
request['CONTENT_TYPE'].should == 'application/x-www-form-urlencoded'
|
286
326
|
request['rack.request.form_vars'].should == 'a=b&c=d&e[f][g]=h'
|
287
327
|
end
|
288
328
|
|
@@ -294,7 +334,7 @@ describe Typhoeus::Easy do
|
|
294
334
|
easy.perform
|
295
335
|
easy.response_code.should == 200
|
296
336
|
result = JSON.parse(easy.response_body)
|
297
|
-
|
337
|
+
|
298
338
|
{ 'content-type' => 'text/plain',
|
299
339
|
'filename' => 'placeholder.txt',
|
300
340
|
'content' => 'This file is used to test uploading.'
|
@@ -305,7 +345,7 @@ describe Typhoeus::Easy do
|
|
305
345
|
result['request-content-type'].should =~ /multipart/
|
306
346
|
end
|
307
347
|
end
|
308
|
-
|
348
|
+
|
309
349
|
describe "delete" do
|
310
350
|
it "should perform a delete" do
|
311
351
|
easy = Typhoeus::Easy.new
|
@@ -315,7 +355,7 @@ describe Typhoeus::Easy do
|
|
315
355
|
easy.response_code.should == 200
|
316
356
|
JSON.parse(easy.response_body)["REQUEST_METHOD"].should == "DELETE"
|
317
357
|
end
|
318
|
-
|
358
|
+
|
319
359
|
it "should send a request body" do
|
320
360
|
easy = Typhoeus::Easy.new
|
321
361
|
easy.url = "http://localhost:3002"
|
@@ -326,9 +366,9 @@ describe Typhoeus::Easy do
|
|
326
366
|
easy.response_body.should include("this is a body!")
|
327
367
|
end
|
328
368
|
end
|
329
|
-
|
369
|
+
|
330
370
|
describe "encoding/compression support" do
|
331
|
-
|
371
|
+
|
332
372
|
it "should send valid encoding headers and decode the response" do
|
333
373
|
easy = Typhoeus::Easy.new
|
334
374
|
easy.url = "http://localhost:3002/gzipped"
|
@@ -347,6 +387,5 @@ describe Typhoeus::Easy do
|
|
347
387
|
easy.response_code.should == 200
|
348
388
|
JSON.parse(easy.response_body)["HTTP_ACCEPT_ENCODING"].should == "deflate, gzip"
|
349
389
|
end
|
350
|
-
|
351
390
|
end
|
352
391
|
end
|
@@ -65,7 +65,7 @@ describe Typhoeus::HydraMock do
|
|
65
65
|
:headers => { 'user-agent' => 'test' })
|
66
66
|
request = Typhoeus::Request.new('http://www.example.com/',
|
67
67
|
:method => :get,
|
68
|
-
:
|
68
|
+
:headers => { 'user-agent' => 'test' })
|
69
69
|
mock.matches?(request).should be_true
|
70
70
|
end
|
71
71
|
|
@@ -74,7 +74,7 @@ describe Typhoeus::HydraMock do
|
|
74
74
|
:headers => { 'user-agent' => 'test' })
|
75
75
|
request = Typhoeus::Request.new('https://www.example.com/',
|
76
76
|
:method => :get,
|
77
|
-
:
|
77
|
+
:headers => { 'user-agent' => 'test' })
|
78
78
|
mock.matches?(request).should be_true
|
79
79
|
end
|
80
80
|
end
|
@@ -87,7 +87,7 @@ describe Typhoeus::HydraMock do
|
|
87
87
|
[:get, :post, :delete, :put].each do |verb|
|
88
88
|
request = Typhoeus::Request.new("http://localhost:3000",
|
89
89
|
:method => verb,
|
90
|
-
:
|
90
|
+
:headers => { 'user-agent' => 'test' })
|
91
91
|
mock.matches?(request).should be_true
|
92
92
|
end
|
93
93
|
end
|
@@ -248,7 +248,7 @@ describe Typhoeus::HydraMock do
|
|
248
248
|
it "should not bother matching on body if we don't turn the option on" do
|
249
249
|
request = Typhoeus::Request.new("http://localhost:3000",
|
250
250
|
:method => :get,
|
251
|
-
:
|
251
|
+
:headers => { 'user-agent' => 'test' },
|
252
252
|
:body => "fdsafdsa")
|
253
253
|
mock = Typhoeus::HydraMock.new("http://localhost:3000", :get,
|
254
254
|
:headers => { 'user-agent' => 'test' })
|
@@ -276,7 +276,7 @@ describe Typhoeus::HydraMock do
|
|
276
276
|
it "should match on optional body parameter" do
|
277
277
|
request = Typhoeus::Request.new("http://localhost:3000",
|
278
278
|
:method => :get,
|
279
|
-
:
|
279
|
+
:headers => { 'user-agent' => 'test' },
|
280
280
|
:body => "fdsafdsa")
|
281
281
|
mock = Typhoeus::HydraMock.new("http://localhost:3000", :get,
|
282
282
|
:body => 'fdsafdsa',
|
@@ -289,7 +289,7 @@ describe Typhoeus::HydraMock do
|
|
289
289
|
it "should regex match" do
|
290
290
|
request = Typhoeus::Request.new("http://localhost:3000/whatever/fdsa",
|
291
291
|
:method => :get,
|
292
|
-
:
|
292
|
+
:headers => { 'user-agent' => 'test' })
|
293
293
|
mock = Typhoeus::HydraMock.new(/fdsa/, :get,
|
294
294
|
:headers => { 'user-agent' => 'test' })
|
295
295
|
mock.matches?(request).should be_true
|
data/spec/typhoeus/hydra_spec.rb
CHANGED
@@ -334,7 +334,7 @@ describe Typhoeus::Hydra::Stubbing do
|
|
334
334
|
before(:each) do
|
335
335
|
@on_complete_handler_called = nil
|
336
336
|
@request = Typhoeus::Request.new("http://localhost:3000/foo",
|
337
|
-
:
|
337
|
+
:headers => { 'user-agent' => 'test' })
|
338
338
|
@request.on_complete do |response|
|
339
339
|
@on_complete_handler_called = true
|
340
340
|
response.code.should == 404
|
data/typhoeus.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: typhoeus
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 21
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 3
|
9
|
-
-
|
10
|
-
version: 0.3.
|
9
|
+
- 3
|
10
|
+
version: 0.3.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- David Balatero
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-
|
19
|
+
date: 2011-11-17 00:00:00 Z
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
22
22
|
name: mime-types
|
@@ -89,6 +89,20 @@ dependencies:
|
|
89
89
|
version: "0"
|
90
90
|
type: :development
|
91
91
|
version_requirements: *id005
|
92
|
+
- !ruby/object:Gem::Dependency
|
93
|
+
name: rake
|
94
|
+
prerelease: false
|
95
|
+
requirement: &id006 !ruby/object:Gem::Requirement
|
96
|
+
none: false
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
hash: 3
|
101
|
+
segments:
|
102
|
+
- 0
|
103
|
+
version: "0"
|
104
|
+
type: :development
|
105
|
+
version_requirements: *id006
|
92
106
|
description: Like a modern code version of the mythical beast with 100 serpent heads, Typhoeus runs HTTP requests in parallel while cleanly encapsulating handling logic.
|
93
107
|
email: dbalatero@gmail.com
|
94
108
|
executables: []
|
@@ -134,6 +148,7 @@ files:
|
|
134
148
|
- spec/fixtures/result_set.xml
|
135
149
|
- spec/servers/app.rb
|
136
150
|
- spec/spec_helper.rb
|
151
|
+
- spec/support/typhoeus_localhost_server.rb
|
137
152
|
- spec/typhoeus/easy_spec.rb
|
138
153
|
- spec/typhoeus/filter_spec.rb
|
139
154
|
- spec/typhoeus/form_spec.rb
|