faraday 0.7.5 → 0.7.6
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.
- data/Gemfile +4 -1
- data/Rakefile +0 -4
- data/faraday.gemspec +9 -8
- data/lib/faraday.rb +1 -1
- data/lib/faraday/adapter/net_http.rb +7 -6
- data/lib/faraday/adapter/patron.rb +8 -1
- data/lib/faraday/adapter/test.rb +8 -0
- data/lib/faraday/adapter/typhoeus.rb +3 -3
- data/lib/faraday/connection.rb +15 -19
- data/lib/faraday/error.rb +3 -3
- data/lib/faraday/middleware.rb +2 -2
- data/lib/faraday/request/multipart.rb +5 -6
- data/lib/faraday/request/url_encoded.rb +1 -3
- data/lib/faraday/response.rb +2 -2
- data/lib/faraday/response/raise_error.rb +1 -1
- data/lib/faraday/upload_io.rb +1 -1
- data/lib/faraday/utils.rb +7 -5
- data/test/adapters/live_test.rb +35 -13
- data/test/adapters/typhoeus_test.rb +20 -0
- data/test/connection_test.rb +28 -2
- data/test/env_test.rb +9 -9
- data/test/helper.rb +12 -6
- data/test/live_server.rb +18 -1
- data/test/request_middleware_test.rb +39 -2
- data/test/response_middleware_test.rb +4 -4
- metadata +28 -28
data/Gemfile
CHANGED
@@ -9,8 +9,11 @@ group :test do
|
|
9
9
|
gem 'em-synchrony', '~> 1.0', :require => ['em-synchrony', 'em-synchrony/em-http'], :platforms => :ruby_19
|
10
10
|
gem 'excon', '~> 0.6'
|
11
11
|
gem 'leftright', '~> 0.9', :require => false
|
12
|
+
end
|
13
|
+
|
14
|
+
platforms :ruby do
|
12
15
|
gem 'patron', '~> 0.4'
|
13
|
-
gem 'typhoeus', '~> 0.
|
16
|
+
gem 'typhoeus', '~> 0.3'
|
14
17
|
# ActiveSupport::JSON will be used in ruby 1.8 and Yajl in 1.9; this is to test against both adapters
|
15
18
|
gem 'activesupport', '~> 2.3', :require => nil, :platforms => [:ruby_18, :jruby]
|
16
19
|
gem 'yajl-ruby', '~> 1.0', :require => 'yajl', :platforms => :ruby_19
|
data/Rakefile
CHANGED
@@ -81,10 +81,6 @@ end
|
|
81
81
|
|
82
82
|
desc "Create tag v#{version} and build and push #{gem_file} to Rubygems"
|
83
83
|
task :release => :build do
|
84
|
-
unless `git branch` =~ /^\* master$/
|
85
|
-
puts "You must be on the master branch to release!"
|
86
|
-
exit!
|
87
|
-
end
|
88
84
|
sh "git commit --allow-empty -a -m 'Release #{version}'"
|
89
85
|
sh "git tag v#{version}"
|
90
86
|
sh "git push origin master"
|
data/faraday.gemspec
CHANGED
@@ -12,8 +12,8 @@ Gem::Specification.new do |s|
|
|
12
12
|
## If your rubyforge_project name is different, then edit it and comment out
|
13
13
|
## the sub! line in the Rakefile
|
14
14
|
s.name = 'faraday'
|
15
|
-
s.version = '0.7.
|
16
|
-
s.date = '
|
15
|
+
s.version = '0.7.6'
|
16
|
+
s.date = '2012-01-21'
|
17
17
|
s.rubyforge_project = 'faraday'
|
18
18
|
|
19
19
|
## Make sure your summary is short. The description may be as long
|
@@ -32,12 +32,12 @@ Gem::Specification.new do |s|
|
|
32
32
|
## require 'NAME.rb' or'/lib/NAME/file.rb' can be as require 'NAME/file.rb'
|
33
33
|
s.require_paths = %w[lib]
|
34
34
|
|
35
|
-
s.add_dependency 'addressable', '~> 2.2
|
36
|
-
s.add_dependency 'multipart-post', '~> 1.1
|
37
|
-
s.add_dependency 'rack',
|
38
|
-
s.add_development_dependency 'rake'
|
39
|
-
s.add_development_dependency 'test-unit'
|
40
|
-
s.add_development_dependency 'webmock'
|
35
|
+
s.add_dependency 'addressable', '~> 2.2'
|
36
|
+
s.add_dependency 'multipart-post', '~> 1.1'
|
37
|
+
s.add_dependency 'rack', '~> 1.1'
|
38
|
+
s.add_development_dependency 'rake'
|
39
|
+
s.add_development_dependency 'test-unit'
|
40
|
+
s.add_development_dependency 'webmock'
|
41
41
|
|
42
42
|
## Leave this section as-is. It will be automatically generated from the
|
43
43
|
## contents of your Git repository via the gemspec task. DO NOT REMOVE
|
@@ -76,6 +76,7 @@ Gem::Specification.new do |s|
|
|
76
76
|
test/adapters/logger_test.rb
|
77
77
|
test/adapters/net_http_test.rb
|
78
78
|
test/adapters/test_middleware_test.rb
|
79
|
+
test/adapters/typhoeus_test.rb
|
79
80
|
test/connection_test.rb
|
80
81
|
test/env_test.rb
|
81
82
|
test/helper.rb
|
data/lib/faraday.rb
CHANGED
@@ -17,8 +17,7 @@ module Faraday
|
|
17
17
|
|
18
18
|
if http.use_ssl = (url.scheme == 'https' && (ssl = env[:ssl]) && true)
|
19
19
|
http.verify_mode = ssl[:verify_mode] || begin
|
20
|
-
if ssl.fetch(:verify, true)
|
21
|
-
OpenSSL::SSL::VERIFY_PEER
|
20
|
+
if ssl.fetch(:verify, true)
|
22
21
|
# Use the default cert store by default, i.e. system ca certs
|
23
22
|
store = OpenSSL::X509::Store.new
|
24
23
|
store.set_default_paths
|
@@ -40,11 +39,11 @@ module Faraday
|
|
40
39
|
http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
|
41
40
|
http.open_timeout = req[:open_timeout] if req[:open_timeout]
|
42
41
|
|
43
|
-
if :get != env[:method]
|
42
|
+
if :get != env[:method] or env[:body]
|
44
43
|
http_request = Net::HTTPGenericRequest.new \
|
45
44
|
env[:method].to_s.upcase, # request method
|
46
|
-
!!env[:body], # is there
|
47
|
-
|
45
|
+
!!env[:body], # is there request body
|
46
|
+
:head != env[:method], # is there response body
|
48
47
|
url.request_uri, # request uri path
|
49
48
|
env[:request_headers] # request headers
|
50
49
|
|
@@ -55,7 +54,7 @@ module Faraday
|
|
55
54
|
end
|
56
55
|
|
57
56
|
begin
|
58
|
-
http_response = if :get == env[:method]
|
57
|
+
http_response = if :get == env[:method] and env[:body].nil?
|
59
58
|
# prefer `get` to `request` because the former handles gzip (ruby 1.9)
|
60
59
|
http.get url.request_uri, env[:request_headers]
|
61
60
|
else
|
@@ -72,6 +71,8 @@ module Faraday
|
|
72
71
|
end
|
73
72
|
|
74
73
|
@app.call env
|
74
|
+
rescue Timeout::Error => err
|
75
|
+
raise Faraday::Error::TimeoutError, err
|
75
76
|
end
|
76
77
|
|
77
78
|
def net_http_class(env)
|
@@ -11,8 +11,13 @@ module Faraday
|
|
11
11
|
|
12
12
|
session = ::Patron::Session.new
|
13
13
|
|
14
|
+
if req = env[:request]
|
15
|
+
session.timeout = session.connect_timeout = req[:timeout] if req[:timeout]
|
16
|
+
session.connect_timeout = req[:open_timeout] if req[:open_timeout]
|
17
|
+
end
|
18
|
+
|
14
19
|
response = begin
|
15
|
-
data =
|
20
|
+
data = env[:body] ? env[:body].to_s : nil
|
16
21
|
session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data)
|
17
22
|
rescue Errno::ECONNREFUSED
|
18
23
|
raise Error::ConnectionFailed, $!
|
@@ -21,6 +26,8 @@ module Faraday
|
|
21
26
|
save_response(env, response.status, response.body, response.headers)
|
22
27
|
|
23
28
|
@app.call env
|
29
|
+
rescue ::Patron::TimeoutError => err
|
30
|
+
raise Faraday::Error::TimeoutError, err
|
24
31
|
end
|
25
32
|
|
26
33
|
if loaded? && defined?(::Patron::Request::VALID_ACTIONS)
|
data/lib/faraday/adapter/test.rb
CHANGED
@@ -59,10 +59,18 @@ module Faraday
|
|
59
59
|
new_stub(:put, path, body, &block)
|
60
60
|
end
|
61
61
|
|
62
|
+
def patch(path, body=nil, &block)
|
63
|
+
new_stub(:patch, path, body, &block)
|
64
|
+
end
|
65
|
+
|
62
66
|
def delete(path, &block)
|
63
67
|
new_stub(:delete, path, &block)
|
64
68
|
end
|
65
69
|
|
70
|
+
def options(path, &block)
|
71
|
+
new_stub(:options, path, &block)
|
72
|
+
end
|
73
|
+
|
66
74
|
# Raises an error if any of the stubbed calls have not been made.
|
67
75
|
def verify_stubbed_calls
|
68
76
|
failed_stubs = []
|
@@ -29,16 +29,16 @@ module Faraday
|
|
29
29
|
end
|
30
30
|
|
31
31
|
env_req = env[:request]
|
32
|
-
|
32
|
+
|
33
33
|
if proxy = env_req[:proxy]
|
34
34
|
req.proxy = "#{proxy[:uri].host}:#{proxy[:uri].port}"
|
35
|
-
|
35
|
+
|
36
36
|
if proxy[:username] && proxy[:password]
|
37
37
|
req.proxy_username = proxy[:username]
|
38
38
|
req.proxy_password = proxy[:password]
|
39
39
|
end
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
42
|
req.timeout = req.connect_timeout = (env_req[:timeout] * 1000) if env_req[:timeout]
|
43
43
|
req.connect_timeout = (env_req[:open_timeout] * 1000) if env_req[:open_timeout]
|
44
44
|
|
data/lib/faraday/connection.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'addressable/uri'
|
2
2
|
require 'base64'
|
3
|
+
require 'cgi'
|
3
4
|
require 'set'
|
4
5
|
require 'faraday/builder'
|
5
6
|
require 'faraday/request'
|
@@ -32,7 +33,10 @@ module Faraday
|
|
32
33
|
@ssl = options[:ssl] || {}
|
33
34
|
@parallel_manager = options[:parallel]
|
34
35
|
|
36
|
+
@path_prefix = @host = @port = @scheme = nil
|
35
37
|
self.url_prefix = url if url
|
38
|
+
|
39
|
+
@proxy = nil
|
36
40
|
proxy(options[:proxy])
|
37
41
|
|
38
42
|
@params.update options[:params] if options[:params]
|
@@ -145,17 +149,14 @@ module Faraday
|
|
145
149
|
def proxy(arg = nil)
|
146
150
|
return @proxy if arg.nil?
|
147
151
|
|
148
|
-
@proxy =
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
raise ArgumentError, "no :uri option."
|
157
|
-
end
|
158
|
-
end
|
152
|
+
@proxy = if arg.is_a? Hash
|
153
|
+
uri = arg.fetch(:uri) { raise ArgumentError, "no :uri option" }
|
154
|
+
arg.merge :uri => URI.parse(uri)
|
155
|
+
else
|
156
|
+
{:uri => URI.parse(arg)}
|
157
|
+
end
|
158
|
+
rescue TypeError
|
159
|
+
raise ArgumentError, "bad uri"
|
159
160
|
end
|
160
161
|
|
161
162
|
# Parses the giving url with Addressable::URI and stores the individual
|
@@ -177,7 +178,9 @@ module Faraday
|
|
177
178
|
self.path_prefix = uri.path
|
178
179
|
|
179
180
|
@params.merge_query(uri.query)
|
180
|
-
|
181
|
+
if uri.user && uri.password
|
182
|
+
basic_auth(CGI.unescape(uri.user), CGI.unescape(uri.password))
|
183
|
+
end
|
181
184
|
|
182
185
|
uri
|
183
186
|
end
|
@@ -239,12 +242,5 @@ module Faraday
|
|
239
242
|
def dup
|
240
243
|
self.class.new(build_url(''), :headers => headers.dup, :params => params.dup, :builder => builder.dup, :ssl => ssl.dup)
|
241
244
|
end
|
242
|
-
|
243
|
-
def proxy_arg_to_uri(arg)
|
244
|
-
case arg
|
245
|
-
when String then URI.parse(arg)
|
246
|
-
when URI then arg
|
247
|
-
end
|
248
|
-
end
|
249
245
|
end
|
250
246
|
end
|
data/lib/faraday/error.rb
CHANGED
@@ -3,9 +3,9 @@ module Faraday
|
|
3
3
|
class ClientError < StandardError
|
4
4
|
attr_reader :response
|
5
5
|
|
6
|
-
def initialize(ex)
|
6
|
+
def initialize(ex, response = nil)
|
7
7
|
@wrapped_exception = nil
|
8
|
-
@response =
|
8
|
+
@response = response
|
9
9
|
|
10
10
|
if ex.respond_to?(:backtrace)
|
11
11
|
super(ex.message)
|
@@ -34,7 +34,7 @@ module Faraday
|
|
34
34
|
class ConnectionFailed < ClientError; end
|
35
35
|
class ResourceNotFound < ClientError; end
|
36
36
|
class ParsingError < ClientError; end
|
37
|
-
|
37
|
+
class TimeoutError < ClientError; end
|
38
38
|
class MissingDependency < StandardError; end
|
39
39
|
end
|
40
40
|
end
|
data/lib/faraday/middleware.rb
CHANGED
@@ -21,12 +21,11 @@ module Faraday
|
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
24
|
-
def has_multipart?(
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
return true if has_multipart?(val)
|
24
|
+
def has_multipart?(obj)
|
25
|
+
# string is an enum in 1.8, returning list of itself
|
26
|
+
if obj.respond_to?(:each) && !obj.is_a?(String)
|
27
|
+
(obj.respond_to?(:values) ? obj.values : obj).each do |val|
|
28
|
+
return true if (val.respond_to?(:content_type) || has_multipart?(val))
|
30
29
|
end
|
31
30
|
end
|
32
31
|
false
|
@@ -13,10 +13,8 @@ module Faraday
|
|
13
13
|
end
|
14
14
|
@app.call env
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def match_content_type(env)
|
18
|
-
type = request_type(env)
|
19
|
-
|
20
18
|
if process_request?(env)
|
21
19
|
env[:request_headers][CONTENT_TYPE] ||= self.class.mime_type
|
22
20
|
yield env[:body] unless env[:body].respond_to?(:to_str)
|
data/lib/faraday/response.rb
CHANGED
data/lib/faraday/upload_io.rb
CHANGED
data/lib/faraday/utils.rb
CHANGED
@@ -35,7 +35,7 @@ module Faraday
|
|
35
35
|
return unless header_string && !header_string.empty?
|
36
36
|
header_string.split(/\r\n/).
|
37
37
|
tap { |a| a.shift if a.first.index('HTTP/') == 0 }. # drop the HTTP status line
|
38
|
-
map { |h| h.split(/:\s+/, 2) }.reject { |
|
38
|
+
map { |h| h.split(/:\s+/, 2) }.reject { |p| p[0].nil? }. # split key and value, ignore blank lines
|
39
39
|
each { |key, value|
|
40
40
|
# join multiple values with a comma
|
41
41
|
if self[key] then self[key] << ', ' << value
|
@@ -109,10 +109,10 @@ module Faraday
|
|
109
109
|
def build_nested_query(value, prefix = nil)
|
110
110
|
case value
|
111
111
|
when Array
|
112
|
-
value.map { |v| build_nested_query(v, "#{prefix}
|
112
|
+
value.map { |v| build_nested_query(v, "#{prefix}%5B%5D") }.join("&")
|
113
113
|
when Hash
|
114
114
|
value.map { |k, v|
|
115
|
-
build_nested_query(v, prefix ? "#{prefix}
|
115
|
+
build_nested_query(v, prefix ? "#{prefix}%5B#{escape(k)}%5D" : escape(k))
|
116
116
|
}.join("&")
|
117
117
|
when NilClass
|
118
118
|
prefix
|
@@ -125,8 +125,10 @@ module Faraday
|
|
125
125
|
# Be sure to URI escape '+' symbols to %2B. Otherwise, they get interpreted
|
126
126
|
# as spaces.
|
127
127
|
def escape(s)
|
128
|
-
s.to_s
|
129
|
-
|
128
|
+
s = s.to_s
|
129
|
+
s = s.dup.force_encoding('binary') if s.respond_to? :force_encoding
|
130
|
+
s.gsub(/([^a-zA-Z0-9_.-]+)/n) do |match|
|
131
|
+
'%' << match.unpack('H2'*bytesize(match)).join('%').tap { |c| c.upcase! }
|
130
132
|
end
|
131
133
|
end
|
132
134
|
|
data/test/adapters/live_test.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require File.expand_path(
|
1
|
+
require File.expand_path("../../helper", __FILE__)
|
2
2
|
|
3
3
|
if !Faraday::TestCase::LIVE_SERVER
|
4
4
|
warn "warning: test server not specified; skipping live server tests"
|
@@ -10,6 +10,8 @@ else
|
|
10
10
|
else
|
11
11
|
loaded_adapters = Faraday::Adapter.all_loaded_constants
|
12
12
|
loaded_adapters -= [Faraday::Adapter::ActionDispatch]
|
13
|
+
# https://github.com/geemus/excon/issues/98
|
14
|
+
loaded_adapters -= [Faraday::Adapter::Excon] if defined? RUBY_ENGINE and "rbx" == RUBY_ENGINE
|
13
15
|
loaded_adapters << :default
|
14
16
|
end
|
15
17
|
|
@@ -27,8 +29,8 @@ else
|
|
27
29
|
|
28
30
|
define_method "test_#{adapter}_GET_retrieves_the_response_headers" do
|
29
31
|
response = create_connection(adapter).get('hello_world')
|
30
|
-
assert_match
|
31
|
-
assert_match
|
32
|
+
assert_match(/text\/html/, response.headers['Content-Type'], 'original case fail')
|
33
|
+
assert_match(/text\/html/, response.headers['content-type'], 'lowercase fail')
|
32
34
|
end
|
33
35
|
|
34
36
|
# https://github.com/geemus/excon/issues/10
|
@@ -39,6 +41,17 @@ else
|
|
39
41
|
end
|
40
42
|
end
|
41
43
|
|
44
|
+
# https://github.com/dbalatero/typhoeus/issues/75
|
45
|
+
# https://github.com/toland/patron/issues/52
|
46
|
+
unless %[Faraday::Adapter::Typhoeus Faraday::Adapter::Patron].include? adapter.to_s
|
47
|
+
define_method "test_#{adapter}_GET_with_body" do
|
48
|
+
response = create_connection(adapter).get('echo') do |req|
|
49
|
+
req.body = {'bodyrock' => true}
|
50
|
+
end
|
51
|
+
assert_equal %(get {"bodyrock"=>"true"}), response.body
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
42
55
|
define_method "test_#{adapter}_POST_send_url_encoded_params" do
|
43
56
|
resp = create_connection(adapter).post do |req|
|
44
57
|
req.url 'echo_name'
|
@@ -56,7 +69,7 @@ else
|
|
56
69
|
end
|
57
70
|
|
58
71
|
define_method "test_#{adapter}_POST_retrieves_the_response_headers" do
|
59
|
-
assert_match
|
72
|
+
assert_match(/text\/html/, create_connection(adapter).post('echo_name').headers['content-type'])
|
60
73
|
end
|
61
74
|
|
62
75
|
define_method "test_#{adapter}_POST_sends_files" do
|
@@ -90,7 +103,7 @@ else
|
|
90
103
|
# https://github.com/dbalatero/typhoeus/issues/84
|
91
104
|
if ENV['FORCE'] || !%w[Faraday::Adapter::Patron Faraday::Adapter::Typhoeus].include?(adapter.to_s)
|
92
105
|
define_method "test_#{adapter}_PUT_retrieves_the_response_headers" do
|
93
|
-
assert_match
|
106
|
+
assert_match(/text\/html/, create_connection(adapter).put('echo_name').headers['content-type'])
|
94
107
|
end
|
95
108
|
end
|
96
109
|
|
@@ -113,7 +126,7 @@ else
|
|
113
126
|
resp = create_connection(adapter).head do |req|
|
114
127
|
req.url 'hello', 'name' => 'zack'
|
115
128
|
end
|
116
|
-
assert_match
|
129
|
+
assert_match(/text\/html/, resp.headers['content-type'])
|
117
130
|
end
|
118
131
|
|
119
132
|
define_method "test_#{adapter}_HEAD_retrieves_no_response_body" do
|
@@ -121,21 +134,21 @@ else
|
|
121
134
|
end
|
122
135
|
|
123
136
|
define_method "test_#{adapter}_HEAD_retrieves_the_response_headers" do
|
124
|
-
assert_match
|
137
|
+
assert_match(/text\/html/, create_connection(adapter).head('hello_world').headers['content-type'])
|
125
138
|
end
|
126
139
|
|
127
140
|
define_method "test_#{adapter}_DELETE_retrieves_the_response_headers" do
|
128
|
-
assert_match
|
141
|
+
assert_match(/text\/html/, create_connection(adapter).delete('delete_with_json').headers['content-type'])
|
129
142
|
end
|
130
143
|
|
131
144
|
define_method "test_#{adapter}_DELETE_retrieves_the_body" do
|
132
|
-
assert_match
|
145
|
+
assert_match(/deleted/, create_connection(adapter).delete('delete_with_json').body)
|
133
146
|
end
|
134
147
|
|
135
148
|
define_method "test_#{adapter}_async_requests_clear_parallel_manager_after_running_a_single_request" do
|
136
149
|
connection = create_connection(adapter)
|
137
150
|
assert !connection.in_parallel?
|
138
|
-
|
151
|
+
connection.get('hello_world')
|
139
152
|
assert !connection.in_parallel?
|
140
153
|
assert_equal 'hello world', connection.get('hello_world').body
|
141
154
|
end
|
@@ -173,9 +186,18 @@ else
|
|
173
186
|
end
|
174
187
|
end
|
175
188
|
end
|
189
|
+
|
190
|
+
if %w[Faraday::Adapter::Patron Faraday::Adapter::NetHttp].include?(adapter.to_s)
|
191
|
+
define_method "test_#{adapter}_timeout" do
|
192
|
+
conn = create_connection(adapter, :request => {:timeout => 1, :read_timeout => 1})
|
193
|
+
assert_raise Faraday::Error::TimeoutError do
|
194
|
+
conn.get '/slow'
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
176
198
|
end
|
177
199
|
|
178
|
-
def create_connection(adapter)
|
200
|
+
def create_connection(adapter, options = {})
|
179
201
|
if adapter == :default
|
180
202
|
builder_block = nil
|
181
203
|
else
|
@@ -185,8 +207,8 @@ else
|
|
185
207
|
b.use adapter
|
186
208
|
end
|
187
209
|
end
|
188
|
-
|
189
|
-
Faraday::Connection.new(LIVE_SERVER, &builder_block).tap do |conn|
|
210
|
+
|
211
|
+
Faraday::Connection.new(LIVE_SERVER, options, &builder_block).tap do |conn|
|
190
212
|
conn.headers['X-Faraday-Adapter'] = adapter.to_s
|
191
213
|
adapter_handler = conn.builder.handlers.last
|
192
214
|
conn.builder.insert_before adapter_handler, Faraday::Response::RaiseError
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
|
2
|
+
|
3
|
+
module Adapters
|
4
|
+
class TyphoeusTest < Faraday::TestCase
|
5
|
+
def setup
|
6
|
+
@connection = Faraday.new('http://disney.com') do |b|
|
7
|
+
b.adapter :typhoeus
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_handles_user_agent
|
12
|
+
# default typhoeus agent
|
13
|
+
stub_request(:get, 'disney.com/world').with(:headers => {'User-Agent'=>'Faraday Agent'}){ |request|
|
14
|
+
request.headers["User-Agent"] == 'Faraday Agent'
|
15
|
+
}
|
16
|
+
@connection.get('/world', :user_agent => 'Faraday Agent')
|
17
|
+
end
|
18
|
+
|
19
|
+
end if defined? ::Typhoeus
|
20
|
+
end
|
data/test/connection_test.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
|
+
require 'uri'
|
2
3
|
|
3
4
|
class TestConnection < Faraday::TestCase
|
4
5
|
def test_initialize_parses_host_out_of_given_url
|
@@ -73,6 +74,11 @@ class TestConnection < Faraday::TestCase
|
|
73
74
|
assert_equal 'Basic YWxhZGRpbjpvcGVuc2VzYW1l', conn.headers['Authorization']
|
74
75
|
end
|
75
76
|
|
77
|
+
def test_auto_parses_basic_auth_from_url_and_unescapes
|
78
|
+
conn = Faraday::Connection.new :url => "http://foo%40bar.com:pass%20word@sushi.com/fish"
|
79
|
+
assert_equal 'Basic Zm9vQGJhci5jb206cGFzcyB3b3Jk', conn.headers['Authorization']
|
80
|
+
end
|
81
|
+
|
76
82
|
def test_token_auth_sets_authorization_header
|
77
83
|
conn = Faraday::Connection.new
|
78
84
|
conn.token_auth 'abcdef'
|
@@ -147,13 +153,20 @@ class TestConnection < Faraday::TestCase
|
|
147
153
|
assert_equal '/sake.html', uri.path
|
148
154
|
end
|
149
155
|
|
150
|
-
def
|
156
|
+
def test_build_url_doesnt_add_ending_slash_given_nil_url
|
151
157
|
conn = Faraday::Connection.new
|
152
158
|
conn.url_prefix = "http://sushi.com/nigiri"
|
153
159
|
uri = conn.build_url(nil)
|
154
160
|
assert_equal "/nigiri", uri.path
|
155
161
|
end
|
156
162
|
|
163
|
+
def test_build_url_doesnt_add_ending_slash_given_empty_url
|
164
|
+
conn = Faraday::Connection.new
|
165
|
+
conn.url_prefix = "http://sushi.com/nigiri"
|
166
|
+
uri = conn.build_url('')
|
167
|
+
assert_equal "/nigiri", uri.path
|
168
|
+
end
|
169
|
+
|
157
170
|
def test_build_url_parses_url_params_into_query
|
158
171
|
conn = Faraday::Connection.new
|
159
172
|
uri = conn.build_url("http://sushi.com/sake.html", 'a[b]' => '1 + 2')
|
@@ -196,6 +209,12 @@ class TestConnection < Faraday::TestCase
|
|
196
209
|
assert_equal 'https://sushi.com/sushi/sake.html', uri.to_s
|
197
210
|
end
|
198
211
|
|
212
|
+
def test_build_url_handles_uri_instances
|
213
|
+
conn = Faraday::Connection.new
|
214
|
+
uri = conn.build_url(URI('/sake.html'))
|
215
|
+
assert_equal '/sake.html', uri.path
|
216
|
+
end
|
217
|
+
|
199
218
|
def test_proxy_accepts_string
|
200
219
|
conn = Faraday::Connection.new
|
201
220
|
conn.proxy 'http://proxy.com'
|
@@ -203,13 +222,20 @@ class TestConnection < Faraday::TestCase
|
|
203
222
|
assert_equal [:uri], conn.proxy.keys
|
204
223
|
end
|
205
224
|
|
206
|
-
def
|
225
|
+
def test_proxy_accepts_addressable_uri
|
207
226
|
conn = Faraday::Connection.new
|
208
227
|
conn.proxy Addressable::URI.parse('http://proxy.com')
|
209
228
|
assert_equal 'proxy.com', conn.proxy[:uri].host
|
210
229
|
assert_equal [:uri], conn.proxy.keys
|
211
230
|
end
|
212
231
|
|
232
|
+
def test_proxy_accepts_stdlib_uri
|
233
|
+
conn = Faraday::Connection.new
|
234
|
+
conn.proxy URI('http://proxy.com')
|
235
|
+
assert_equal 'proxy.com', conn.proxy[:uri].host
|
236
|
+
assert_equal [:uri], conn.proxy.keys
|
237
|
+
end
|
238
|
+
|
213
239
|
def test_proxy_accepts_hash_with_string_uri
|
214
240
|
conn = Faraday::Connection.new
|
215
241
|
conn.proxy :uri => 'http://proxy.com', :user => 'rick'
|
data/test/env_test.rb
CHANGED
@@ -112,45 +112,45 @@ class ResponseTest < Faraday::TestCase
|
|
112
112
|
}
|
113
113
|
@response = Faraday::Response.new @env
|
114
114
|
end
|
115
|
-
|
115
|
+
|
116
116
|
def test_finished
|
117
117
|
assert @response.finished?
|
118
118
|
end
|
119
|
-
|
119
|
+
|
120
120
|
def test_error_on_finish
|
121
121
|
assert_raises RuntimeError do
|
122
122
|
@response.finish({})
|
123
123
|
end
|
124
124
|
end
|
125
|
-
|
125
|
+
|
126
126
|
def test_not_success
|
127
127
|
assert !@response.success?
|
128
128
|
end
|
129
|
-
|
129
|
+
|
130
130
|
def test_status
|
131
131
|
assert_equal 404, @response.status
|
132
132
|
end
|
133
|
-
|
133
|
+
|
134
134
|
def test_body
|
135
135
|
assert_equal 'yikes', @response.body
|
136
136
|
end
|
137
|
-
|
137
|
+
|
138
138
|
def test_headers
|
139
139
|
assert_equal 'text/plain', @response.headers['Content-Type']
|
140
140
|
assert_equal 'text/plain', @response['content-type']
|
141
141
|
end
|
142
|
-
|
142
|
+
|
143
143
|
def test_apply_request
|
144
144
|
@response.apply_request :body => 'a=b', :method => :post
|
145
145
|
assert_equal 'yikes', @response.body
|
146
146
|
assert_equal :post, @response.env[:method]
|
147
147
|
end
|
148
|
-
|
148
|
+
|
149
149
|
def test_marshal
|
150
150
|
@response = Faraday::Response.new
|
151
151
|
@response.on_complete { }
|
152
152
|
@response.finish @env.merge(:custom => 'moo')
|
153
|
-
|
153
|
+
|
154
154
|
loaded = Marshal.load Marshal.dump(@response)
|
155
155
|
assert_nil loaded.env[:custom]
|
156
156
|
assert_equal %w[body response_headers status], loaded.env.keys.map { |k| k.to_s }.sort
|
data/test/helper.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
require 'rubygems'
|
2
1
|
require 'test/unit'
|
2
|
+
require 'stringio'
|
3
3
|
|
4
4
|
if ENV['LEFTRIGHT']
|
5
5
|
begin
|
@@ -9,10 +9,6 @@ if ENV['LEFTRIGHT']
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
unless $LOAD_PATH.include? 'lib'
|
13
|
-
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
14
|
-
$LOAD_PATH.unshift(File.join($LOAD_PATH.first, '..', 'lib'))
|
15
|
-
end
|
16
12
|
require 'faraday'
|
17
13
|
|
18
14
|
begin
|
@@ -28,12 +24,22 @@ module Faraday
|
|
28
24
|
LIVE_SERVER = case ENV['LIVE']
|
29
25
|
when /^http/ then ENV['LIVE']
|
30
26
|
when nil then nil
|
31
|
-
else 'http://
|
27
|
+
else 'http://127.0.0.1:4567'
|
32
28
|
end
|
33
29
|
|
34
30
|
def test_default
|
35
31
|
assert true
|
36
32
|
end unless defined? ::MiniTest
|
33
|
+
|
34
|
+
def capture_warnings
|
35
|
+
old, $stderr = $stderr, StringIO.new
|
36
|
+
begin
|
37
|
+
yield
|
38
|
+
$stderr.string
|
39
|
+
ensure
|
40
|
+
$stderr = old
|
41
|
+
end
|
42
|
+
end
|
37
43
|
end
|
38
44
|
end
|
39
45
|
|
data/test/live_server.rb
CHANGED
@@ -1,6 +1,18 @@
|
|
1
1
|
require 'sinatra'
|
2
2
|
set :logging, false
|
3
3
|
|
4
|
+
[:get, :post, :put, :patch, :delete, :options].each do |method|
|
5
|
+
send(method, '/echo') do
|
6
|
+
kind = request.request_method.downcase
|
7
|
+
out = kind.dup
|
8
|
+
out << ' ?' << request.GET.inspect if request.GET.any?
|
9
|
+
out << ' ' << request.POST.inspect if request.POST.any?
|
10
|
+
|
11
|
+
content_type 'text/plain'
|
12
|
+
return out
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
4
16
|
get '/hello_world' do
|
5
17
|
'hello world'
|
6
18
|
end
|
@@ -41,5 +53,10 @@ delete '/delete_with_json' do
|
|
41
53
|
end
|
42
54
|
|
43
55
|
get '/multi' do
|
44
|
-
[200, { 'Set-Cookie' =>
|
56
|
+
[200, { 'Set-Cookie' => 'one, two' }, '']
|
57
|
+
end
|
58
|
+
|
59
|
+
get '/slow' do
|
60
|
+
sleep 10
|
61
|
+
[200, {}, 'ok']
|
45
62
|
end
|
@@ -1,7 +1,8 @@
|
|
1
|
+
# encoding: utf-8
|
1
2
|
require File.expand_path(File.join(File.dirname(__FILE__), 'helper'))
|
2
3
|
require 'rack/utils'
|
3
4
|
|
4
|
-
Faraday::CompositeReadIO.
|
5
|
+
Faraday::CompositeReadIO.class_eval { attr_reader :ios }
|
5
6
|
|
6
7
|
class RequestMiddlewareTest < Faraday::TestCase
|
7
8
|
def setup
|
@@ -76,7 +77,7 @@ class RequestMiddlewareTest < Faraday::TestCase
|
|
76
77
|
def test_url_encoded_no_header
|
77
78
|
response = @conn.post('/echo', { :fruit => %w[apples oranges] })
|
78
79
|
assert_equal 'application/x-www-form-urlencoded', response.headers['Content-Type']
|
79
|
-
assert_equal 'fruit
|
80
|
+
assert_equal 'fruit%5B%5D=apples&fruit%5B%5D=oranges', response.body
|
80
81
|
end
|
81
82
|
|
82
83
|
def test_url_encoded_with_header
|
@@ -92,6 +93,19 @@ class RequestMiddlewareTest < Faraday::TestCase
|
|
92
93
|
assert_equal expected, Rack::Utils.parse_nested_query(response.body)
|
93
94
|
end
|
94
95
|
|
96
|
+
def test_url_encoded_unicode
|
97
|
+
err = capture_warnings {
|
98
|
+
response = @conn.post('/echo', {:str => "eé cç aã aâ"})
|
99
|
+
assert_equal "str=e%C3%A9%20c%C3%A7%20a%C3%A3%20a%C3%A2", response.body
|
100
|
+
}
|
101
|
+
assert err.empty?
|
102
|
+
end
|
103
|
+
|
104
|
+
def test_url_encoded_nested_keys
|
105
|
+
response = @conn.post('/echo', {'a'=>{'b'=>{'c'=>['d']}}})
|
106
|
+
assert_equal "a%5Bb%5D%5Bc%5D%5B%5D=d", response.body
|
107
|
+
end
|
108
|
+
|
95
109
|
def test_multipart
|
96
110
|
# assume params are out of order
|
97
111
|
regexes = [
|
@@ -113,4 +127,27 @@ class RequestMiddlewareTest < Faraday::TestCase
|
|
113
127
|
end
|
114
128
|
assert_equal [], regexes
|
115
129
|
end
|
130
|
+
|
131
|
+
def test_multipart_with_arrays
|
132
|
+
# assume params are out of order
|
133
|
+
regexes = [
|
134
|
+
/name\=\"a\"/,
|
135
|
+
/name=\"b\[\]\[c\]\"\; filename\=\"request_middleware_test\.rb\"/,
|
136
|
+
/name=\"b\[\]\[d\]\"/]
|
137
|
+
|
138
|
+
payload = {:a => 1, :b =>[{:c => Faraday::UploadIO.new(__FILE__, 'text/x-ruby'), :d => 2}]}
|
139
|
+
response = @conn.post('/echo', payload)
|
140
|
+
|
141
|
+
assert_kind_of Faraday::CompositeReadIO, response.body
|
142
|
+
assert_equal "multipart/form-data;boundary=%s" % Faraday::Request::Multipart::DEFAULT_BOUNDARY,
|
143
|
+
response.headers['Content-Type']
|
144
|
+
|
145
|
+
response.body.send(:ios).map{|io| io.read}.each do |io|
|
146
|
+
if re = regexes.detect { |r| io =~ r }
|
147
|
+
regexes.delete re
|
148
|
+
end
|
149
|
+
end
|
150
|
+
assert_equal [], regexes
|
151
|
+
end
|
152
|
+
|
116
153
|
end
|
@@ -23,7 +23,7 @@ class ResponseMiddlewareTest < Faraday::TestCase
|
|
23
23
|
@conn.get('ok')
|
24
24
|
end
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def test_raises_not_found
|
28
28
|
error = assert_raises Faraday::Error::ResourceNotFound do
|
29
29
|
@conn.get('not-found')
|
@@ -31,7 +31,7 @@ class ResponseMiddlewareTest < Faraday::TestCase
|
|
31
31
|
assert_equal 'the server responded with status 404', error.message
|
32
32
|
assert_equal 'because', error.response[:headers]['X-Reason']
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
def test_raises_error
|
36
36
|
error = assert_raises Faraday::Error::ClientError do
|
37
37
|
@conn.get('error')
|
@@ -39,7 +39,7 @@ class ResponseMiddlewareTest < Faraday::TestCase
|
|
39
39
|
assert_equal 'the server responded with status 500', error.message
|
40
40
|
assert_equal 'bailout', error.response[:headers]['X-Error']
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def test_upcase
|
44
44
|
@conn.builder.insert(0, ResponseUpcaser)
|
45
45
|
assert_equal '<BODY></BODY>', @conn.get('ok').body
|
@@ -71,4 +71,4 @@ class ResponseNoBodyMiddleWareTest < Faraday::TestCase
|
|
71
71
|
def test_304
|
72
72
|
assert_equal nil, @conn.get('not modified').body
|
73
73
|
end
|
74
|
-
end
|
74
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.6
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,77 +9,74 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2012-01-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: addressable
|
16
|
-
requirement: &
|
16
|
+
requirement: &70207313872560 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: 2.2
|
21
|
+
version: '2.2'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70207313872560
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: multipart-post
|
27
|
-
requirement: &
|
27
|
+
requirement: &70207313884640 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.1
|
32
|
+
version: '1.1'
|
33
33
|
type: :runtime
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70207313884640
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rack
|
38
|
-
requirement: &
|
38
|
+
requirement: &70207313889320 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
|
-
- -
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: 1.1.0
|
44
|
-
- - <
|
41
|
+
- - ~>
|
45
42
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
43
|
+
version: '1.1'
|
47
44
|
type: :runtime
|
48
45
|
prerelease: false
|
49
|
-
version_requirements: *
|
46
|
+
version_requirements: *70207313889320
|
50
47
|
- !ruby/object:Gem::Dependency
|
51
48
|
name: rake
|
52
|
-
requirement: &
|
49
|
+
requirement: &70207313910400 !ruby/object:Gem::Requirement
|
53
50
|
none: false
|
54
51
|
requirements:
|
55
|
-
- -
|
52
|
+
- - ! '>='
|
56
53
|
- !ruby/object:Gem::Version
|
57
|
-
version: '0
|
54
|
+
version: '0'
|
58
55
|
type: :development
|
59
56
|
prerelease: false
|
60
|
-
version_requirements: *
|
57
|
+
version_requirements: *70207313910400
|
61
58
|
- !ruby/object:Gem::Dependency
|
62
59
|
name: test-unit
|
63
|
-
requirement: &
|
60
|
+
requirement: &70207313926400 !ruby/object:Gem::Requirement
|
64
61
|
none: false
|
65
62
|
requirements:
|
66
|
-
- -
|
63
|
+
- - ! '>='
|
67
64
|
- !ruby/object:Gem::Version
|
68
|
-
version: '
|
65
|
+
version: '0'
|
69
66
|
type: :development
|
70
67
|
prerelease: false
|
71
|
-
version_requirements: *
|
68
|
+
version_requirements: *70207313926400
|
72
69
|
- !ruby/object:Gem::Dependency
|
73
70
|
name: webmock
|
74
|
-
requirement: &
|
71
|
+
requirement: &70207313936720 !ruby/object:Gem::Requirement
|
75
72
|
none: false
|
76
73
|
requirements:
|
77
|
-
- -
|
74
|
+
- - ! '>='
|
78
75
|
- !ruby/object:Gem::Version
|
79
|
-
version: '
|
76
|
+
version: '0'
|
80
77
|
type: :development
|
81
78
|
prerelease: false
|
82
|
-
version_requirements: *
|
79
|
+
version_requirements: *70207313936720
|
83
80
|
description: HTTP/REST API client library.
|
84
81
|
email: technoweenie@gmail.com
|
85
82
|
executables: []
|
@@ -118,6 +115,7 @@ files:
|
|
118
115
|
- test/adapters/logger_test.rb
|
119
116
|
- test/adapters/net_http_test.rb
|
120
117
|
- test/adapters/test_middleware_test.rb
|
118
|
+
- test/adapters/typhoeus_test.rb
|
121
119
|
- test/connection_test.rb
|
122
120
|
- test/env_test.rb
|
123
121
|
- test/helper.rb
|
@@ -145,7 +143,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
145
143
|
version: 1.3.5
|
146
144
|
requirements: []
|
147
145
|
rubyforge_project: faraday
|
148
|
-
rubygems_version: 1.8.
|
146
|
+
rubygems_version: 1.8.12
|
149
147
|
signing_key:
|
150
148
|
specification_version: 2
|
151
149
|
summary: HTTP/REST API client library.
|
@@ -154,6 +152,7 @@ test_files:
|
|
154
152
|
- test/adapters/logger_test.rb
|
155
153
|
- test/adapters/net_http_test.rb
|
156
154
|
- test/adapters/test_middleware_test.rb
|
155
|
+
- test/adapters/typhoeus_test.rb
|
157
156
|
- test/connection_test.rb
|
158
157
|
- test/env_test.rb
|
159
158
|
- test/helper.rb
|
@@ -161,3 +160,4 @@ test_files:
|
|
161
160
|
- test/middleware_stack_test.rb
|
162
161
|
- test/request_middleware_test.rb
|
163
162
|
- test/response_middleware_test.rb
|
163
|
+
has_rdoc:
|