faraday 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +22 -15
- data/{LICENSE → LICENSE.md} +1 -1
- data/README.md +216 -146
- data/Rakefile +14 -58
- data/config.ru +6 -0
- data/faraday.gemspec +31 -38
- data/lib/faraday/adapter/em_http.rb +204 -0
- data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +66 -0
- data/lib/faraday/adapter/em_synchrony.rb +67 -16
- data/lib/faraday/adapter/excon.rb +1 -2
- data/lib/faraday/adapter/net_http.rb +82 -39
- data/lib/faraday/adapter/net_http_persistent.rb +37 -0
- data/lib/faraday/adapter/patron.rb +42 -8
- data/lib/faraday/adapter/rack.rb +59 -0
- data/lib/faraday/adapter/test.rb +49 -9
- data/lib/faraday/adapter/typhoeus.rb +70 -15
- data/lib/faraday/adapter.rb +41 -18
- data/lib/faraday/builder.rb +34 -16
- data/lib/faraday/connection.rb +177 -115
- data/lib/faraday/error.rb +4 -2
- data/lib/faraday/middleware.rb +18 -10
- data/lib/faraday/request/authorization.rb +40 -0
- data/lib/faraday/request/basic_authentication.rb +13 -0
- data/lib/faraday/request/multipart.rb +5 -6
- data/lib/faraday/request/retry.rb +21 -0
- data/lib/faraday/request/token_authentication.rb +15 -0
- data/lib/faraday/request/url_encoded.rb +1 -3
- data/lib/faraday/request.rb +48 -38
- data/lib/faraday/response/raise_error.rb +1 -1
- data/lib/faraday/response.rb +6 -5
- data/lib/faraday/upload_io.rb +1 -1
- data/lib/faraday/utils.rb +196 -29
- data/lib/faraday.rb +69 -13
- data/test/adapters/default_test.rb +14 -0
- data/test/adapters/em_http_test.rb +14 -0
- data/test/adapters/em_synchrony_test.rb +14 -0
- data/test/adapters/excon_test.rb +23 -0
- data/test/adapters/integration.rb +190 -0
- data/test/adapters/logger_test.rb +2 -2
- data/test/adapters/net_http_persistent_test.rb +11 -0
- data/test/adapters/net_http_test.rb +37 -21
- data/test/adapters/patron_test.rb +17 -0
- data/test/adapters/rack_test.rb +26 -0
- data/test/adapters/test_middleware_test.rb +28 -1
- data/test/adapters/typhoeus_test.rb +14 -0
- data/test/authentication_middleware_test.rb +65 -0
- data/test/connection_test.rb +211 -81
- data/test/env_test.rb +80 -31
- data/test/helper.rb +23 -13
- data/test/live_server.rb +38 -29
- data/test/middleware/retry_test.rb +25 -0
- data/test/middleware_stack_test.rb +85 -4
- data/test/request_middleware_test.rb +42 -19
- data/test/response_middleware_test.rb +30 -3
- metadata +104 -110
- data/lib/faraday/adapter/action_dispatch.rb +0 -30
- data/lib/faraday/request/json.rb +0 -31
- data/test/adapters/live_test.rb +0 -186
data/lib/faraday/request.rb
CHANGED
|
@@ -9,34 +9,59 @@ module Faraday
|
|
|
9
9
|
# req.body = 'abc'
|
|
10
10
|
# end
|
|
11
11
|
#
|
|
12
|
-
class Request < Struct.new(:path, :params, :headers, :body)
|
|
12
|
+
class Request < Struct.new(:method, :path, :params, :headers, :body, :options)
|
|
13
13
|
extend AutoloadHelper
|
|
14
|
+
extend MiddlewareRegistry
|
|
14
15
|
|
|
15
16
|
autoload_all 'faraday/request',
|
|
16
|
-
:JSON => 'json',
|
|
17
17
|
:UrlEncoded => 'url_encoded',
|
|
18
|
-
:Multipart
|
|
18
|
+
:Multipart => 'multipart',
|
|
19
|
+
:Retry => 'retry',
|
|
20
|
+
:Timeout => 'timeout',
|
|
21
|
+
:Authorization => 'authorization',
|
|
22
|
+
:BasicAuthentication => 'basic_authentication',
|
|
23
|
+
:TokenAuthentication => 'token_authentication'
|
|
19
24
|
|
|
20
|
-
|
|
21
|
-
:json => :JSON,
|
|
25
|
+
register_middleware \
|
|
22
26
|
:url_encoded => :UrlEncoded,
|
|
23
|
-
:multipart
|
|
27
|
+
:multipart => :Multipart,
|
|
28
|
+
:retry => :Retry,
|
|
29
|
+
:authorization => :Authorization,
|
|
30
|
+
:basic_auth => :BasicAuthentication,
|
|
31
|
+
:token_auth => :TokenAuthentication
|
|
24
32
|
|
|
25
|
-
def self.
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
33
|
+
def self.create(request_method)
|
|
34
|
+
new(request_method).tap do |request|
|
|
35
|
+
yield request if block_given?
|
|
36
|
+
end
|
|
29
37
|
end
|
|
30
38
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
39
|
+
# Public: Replace params, preserving the existing hash type
|
|
40
|
+
def params=(hash)
|
|
41
|
+
if params then params.replace hash
|
|
42
|
+
else super
|
|
43
|
+
end
|
|
35
44
|
end
|
|
36
45
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
46
|
+
# Public: Replace request headers, preserving the existing hash type
|
|
47
|
+
def headers=(hash)
|
|
48
|
+
if headers then headers.replace hash
|
|
49
|
+
else super
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def url(path, params = nil)
|
|
54
|
+
if path.respond_to? :query
|
|
55
|
+
if query = path.query
|
|
56
|
+
path = path.dup
|
|
57
|
+
path.query = nil
|
|
58
|
+
end
|
|
59
|
+
else
|
|
60
|
+
path, query = path.split('?', 2)
|
|
61
|
+
end
|
|
62
|
+
self.path = path
|
|
63
|
+
self.params.merge_query query
|
|
64
|
+
self.params.update(params) if params
|
|
40
65
|
end
|
|
41
66
|
|
|
42
67
|
def [](key)
|
|
@@ -50,7 +75,7 @@ module Faraday
|
|
|
50
75
|
# ENV Keys
|
|
51
76
|
# :method - a symbolized request method (:get, :post)
|
|
52
77
|
# :body - the request body that will eventually be converted to a string.
|
|
53
|
-
# :url -
|
|
78
|
+
# :url - URI instance for the current request.
|
|
54
79
|
# :status - HTTP response status code
|
|
55
80
|
# :request_headers - hash of HTTP Headers to be sent to the server
|
|
56
81
|
# :response_headers - Hash of HTTP headers from the server
|
|
@@ -63,29 +88,14 @@ module Faraday
|
|
|
63
88
|
# :user - Proxy server username
|
|
64
89
|
# :password - Proxy server password
|
|
65
90
|
# :ssl - Hash of options for configuring SSL requests.
|
|
66
|
-
def
|
|
67
|
-
|
|
68
|
-
env_params = connection.params.dup
|
|
69
|
-
connection.merge_headers(env_headers, headers)
|
|
70
|
-
connection.merge_params(env_params, params)
|
|
71
|
-
|
|
72
|
-
{ :method => request_method,
|
|
91
|
+
def to_env(connection)
|
|
92
|
+
{ :method => method,
|
|
73
93
|
:body => body,
|
|
74
|
-
:url => connection.
|
|
75
|
-
:request_headers =>
|
|
94
|
+
:url => connection.build_exclusive_url(path, params),
|
|
95
|
+
:request_headers => headers,
|
|
76
96
|
:parallel_manager => connection.parallel_manager,
|
|
77
|
-
:request =>
|
|
97
|
+
:request => options,
|
|
78
98
|
:ssl => connection.ssl}
|
|
79
99
|
end
|
|
80
|
-
|
|
81
|
-
def run(connection, request_method)
|
|
82
|
-
app = lambda { |env|
|
|
83
|
-
response = Response.new
|
|
84
|
-
response.finish(env) unless env[:parallel_manager]
|
|
85
|
-
env[:response] = response
|
|
86
|
-
}
|
|
87
|
-
env = to_env_hash(connection, request_method)
|
|
88
|
-
connection.builder.to_app(app).call(env)
|
|
89
|
-
end
|
|
90
100
|
end
|
|
91
101
|
end
|
data/lib/faraday/response.rb
CHANGED
|
@@ -5,8 +5,8 @@ module Faraday
|
|
|
5
5
|
# Used for simple response middleware.
|
|
6
6
|
class Middleware < Faraday::Middleware
|
|
7
7
|
def call(env)
|
|
8
|
-
@app.call(env).on_complete do |
|
|
9
|
-
on_complete(
|
|
8
|
+
@app.call(env).on_complete do |environment|
|
|
9
|
+
on_complete(environment)
|
|
10
10
|
end
|
|
11
11
|
end
|
|
12
12
|
|
|
@@ -14,19 +14,20 @@ module Faraday
|
|
|
14
14
|
# Calls the `parse` method if defined
|
|
15
15
|
def on_complete(env)
|
|
16
16
|
if respond_to? :parse
|
|
17
|
-
env[:body] = parse(env[:body])
|
|
17
|
+
env[:body] = parse(env[:body]) unless [204,304].index env[:status]
|
|
18
18
|
end
|
|
19
19
|
end
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
extend Forwardable
|
|
23
23
|
extend AutoloadHelper
|
|
24
|
+
extend MiddlewareRegistry
|
|
24
25
|
|
|
25
26
|
autoload_all 'faraday/response',
|
|
26
27
|
:RaiseError => 'raise_error',
|
|
27
28
|
:Logger => 'logger'
|
|
28
29
|
|
|
29
|
-
|
|
30
|
+
register_middleware \
|
|
30
31
|
:raise_error => :RaiseError,
|
|
31
32
|
:logger => :Logger
|
|
32
33
|
|
|
@@ -72,7 +73,7 @@ module Faraday
|
|
|
72
73
|
end
|
|
73
74
|
|
|
74
75
|
def success?
|
|
75
|
-
status
|
|
76
|
+
(200..299).include?(status)
|
|
76
77
|
end
|
|
77
78
|
|
|
78
79
|
# because @on_complete_callbacks cannot be marshalled
|
data/lib/faraday/upload_io.rb
CHANGED
data/lib/faraday/utils.rb
CHANGED
|
@@ -1,12 +1,17 @@
|
|
|
1
|
-
require '
|
|
1
|
+
require 'cgi'
|
|
2
|
+
|
|
2
3
|
module Faraday
|
|
3
4
|
module Utils
|
|
4
|
-
include Rack::Utils
|
|
5
|
-
|
|
6
|
-
extend Rack::Utils
|
|
7
5
|
extend self
|
|
8
6
|
|
|
9
|
-
|
|
7
|
+
# Adapted from Rack::Utils::HeaderHash
|
|
8
|
+
class Headers < ::Hash
|
|
9
|
+
def initialize(hash={})
|
|
10
|
+
super()
|
|
11
|
+
@names = {}
|
|
12
|
+
self.update hash
|
|
13
|
+
end
|
|
14
|
+
|
|
10
15
|
# symbol -> string mapper + cache
|
|
11
16
|
KeyMap = Hash.new do |map, key|
|
|
12
17
|
map[key] = if key.respond_to?(:to_str) then key
|
|
@@ -17,24 +22,60 @@ module Faraday
|
|
|
17
22
|
end
|
|
18
23
|
end
|
|
19
24
|
KeyMap[:etag] = "ETag"
|
|
20
|
-
|
|
25
|
+
|
|
21
26
|
def [](k)
|
|
22
|
-
|
|
27
|
+
k = KeyMap[k]
|
|
28
|
+
super(k) || super(@names[k.downcase])
|
|
23
29
|
end
|
|
24
30
|
|
|
25
31
|
def []=(k, v)
|
|
32
|
+
k = KeyMap[k]
|
|
33
|
+
k = (@names[k.downcase] ||= k)
|
|
26
34
|
# join multiple values with a comma
|
|
27
35
|
v = v.to_ary.join(', ') if v.respond_to? :to_ary
|
|
28
|
-
super
|
|
36
|
+
super k, v
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def delete(k)
|
|
40
|
+
k = KeyMap[k]
|
|
41
|
+
if k = @names[k.downcase]
|
|
42
|
+
@names.delete k.downcase
|
|
43
|
+
super k
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def include?(k)
|
|
48
|
+
@names.include? k.downcase
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
alias_method :has_key?, :include?
|
|
52
|
+
alias_method :member?, :include?
|
|
53
|
+
alias_method :key?, :include?
|
|
54
|
+
|
|
55
|
+
def merge!(other)
|
|
56
|
+
other.each { |k, v| self[k] = v }
|
|
57
|
+
self
|
|
29
58
|
end
|
|
30
|
-
|
|
31
59
|
alias_method :update, :merge!
|
|
32
|
-
|
|
60
|
+
|
|
61
|
+
def merge(other)
|
|
62
|
+
hash = dup
|
|
63
|
+
hash.merge! other
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def replace(other)
|
|
67
|
+
clear
|
|
68
|
+
self.update other
|
|
69
|
+
self
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def to_hash() ::Hash.new.update(self) end
|
|
73
|
+
|
|
33
74
|
def parse(header_string)
|
|
34
75
|
return unless header_string && !header_string.empty?
|
|
35
76
|
header_string.split(/\r\n/).
|
|
36
77
|
tap { |a| a.shift if a.first.index('HTTP/') == 0 }. # drop the HTTP status line
|
|
37
|
-
map { |h| h.split(/:\s+/, 2) }.reject { |
|
|
78
|
+
map { |h| h.split(/:\s+/, 2) }.reject { |p| p[0].nil? }. # split key and value, ignore blank lines
|
|
38
79
|
each { |key, value|
|
|
39
80
|
# join multiple values with a comma
|
|
40
81
|
if self[key] then self[key] << ', ' << value
|
|
@@ -44,17 +85,82 @@ module Faraday
|
|
|
44
85
|
end
|
|
45
86
|
end
|
|
46
87
|
|
|
47
|
-
#
|
|
48
|
-
|
|
88
|
+
# hash with stringified keys
|
|
89
|
+
class ParamsHash < Hash
|
|
90
|
+
def [](key)
|
|
91
|
+
super(convert_key(key))
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
def []=(key, value)
|
|
95
|
+
super(convert_key(key), value)
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
def delete(key)
|
|
99
|
+
super(convert_key(key))
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def include?(key)
|
|
103
|
+
super(convert_key(key))
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
alias_method :has_key?, :include?
|
|
107
|
+
alias_method :member?, :include?
|
|
108
|
+
alias_method :key?, :include?
|
|
109
|
+
|
|
110
|
+
def update(params)
|
|
111
|
+
params.each do |key, value|
|
|
112
|
+
self[key] = value
|
|
113
|
+
end
|
|
114
|
+
self
|
|
115
|
+
end
|
|
116
|
+
alias_method :merge!, :update
|
|
117
|
+
|
|
118
|
+
def merge(params)
|
|
119
|
+
dup.update(params)
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
def replace(other)
|
|
123
|
+
clear
|
|
124
|
+
update(other)
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def merge_query(query)
|
|
128
|
+
if query && !query.empty?
|
|
129
|
+
update Utils.parse_query(query)
|
|
130
|
+
end
|
|
131
|
+
self
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
def to_query
|
|
135
|
+
Utils.build_nested_query(self)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
private
|
|
139
|
+
|
|
140
|
+
def convert_key(key)
|
|
141
|
+
key.to_s
|
|
142
|
+
end
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Copied from Rack
|
|
146
|
+
def build_query(params)
|
|
147
|
+
params.map { |k, v|
|
|
148
|
+
if v.class == Array
|
|
149
|
+
build_query(v.map { |x| [k, x] })
|
|
150
|
+
else
|
|
151
|
+
v.nil? ? escape(k) : "#{escape(k)}=#{escape(v)}"
|
|
152
|
+
end
|
|
153
|
+
}.join("&")
|
|
154
|
+
end
|
|
49
155
|
|
|
50
|
-
#
|
|
156
|
+
# Rack's version modified to handle non-String values
|
|
51
157
|
def build_nested_query(value, prefix = nil)
|
|
52
158
|
case value
|
|
53
159
|
when Array
|
|
54
|
-
value.map { |v| build_nested_query(v, "#{prefix}
|
|
160
|
+
value.map { |v| build_nested_query(v, "#{prefix}%5B%5D") }.join("&")
|
|
55
161
|
when Hash
|
|
56
162
|
value.map { |k, v|
|
|
57
|
-
build_nested_query(v, prefix ? "#{prefix}
|
|
163
|
+
build_nested_query(v, prefix ? "#{prefix}%5B#{escape(k)}%5D" : escape(k))
|
|
58
164
|
}.join("&")
|
|
59
165
|
when NilClass
|
|
60
166
|
prefix
|
|
@@ -64,26 +170,70 @@ module Faraday
|
|
|
64
170
|
end
|
|
65
171
|
end
|
|
66
172
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
def
|
|
70
|
-
|
|
71
|
-
|
|
173
|
+
def escape(s) CGI.escape s.to_s end
|
|
174
|
+
|
|
175
|
+
def unescape(s) CGI.unescape s.to_s end
|
|
176
|
+
|
|
177
|
+
DEFAULT_SEP = /[&;] */n
|
|
178
|
+
|
|
179
|
+
# Adapted from Rack
|
|
180
|
+
def parse_query(qs)
|
|
181
|
+
params = {}
|
|
182
|
+
|
|
183
|
+
(qs || '').split(DEFAULT_SEP).each do |p|
|
|
184
|
+
k, v = p.split('=', 2).map { |x| unescape(x) }
|
|
185
|
+
|
|
186
|
+
if cur = params[k]
|
|
187
|
+
if cur.class == Array then params[k] << v
|
|
188
|
+
else params[k] = [cur, v]
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
params[k] = v
|
|
192
|
+
end
|
|
72
193
|
end
|
|
194
|
+
params
|
|
73
195
|
end
|
|
74
196
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
197
|
+
def parse_nested_query(qs)
|
|
198
|
+
params = {}
|
|
199
|
+
|
|
200
|
+
(qs || '').split(DEFAULT_SEP).each do |p|
|
|
201
|
+
k, v = p.split('=', 2).map { |s| unescape(s) }
|
|
202
|
+
normalize_params(params, k, v)
|
|
79
203
|
end
|
|
204
|
+
params
|
|
80
205
|
end
|
|
81
206
|
|
|
82
|
-
#
|
|
83
|
-
def
|
|
84
|
-
|
|
85
|
-
|
|
207
|
+
# Stolen from Rack
|
|
208
|
+
def normalize_params(params, name, v = nil)
|
|
209
|
+
name =~ %r(\A[\[\]]*([^\[\]]+)\]*)
|
|
210
|
+
k = $1 || ''
|
|
211
|
+
after = $' || ''
|
|
212
|
+
|
|
213
|
+
return if k.empty?
|
|
214
|
+
|
|
215
|
+
if after == ""
|
|
216
|
+
params[k] = v
|
|
217
|
+
elsif after == "[]"
|
|
218
|
+
params[k] ||= []
|
|
219
|
+
raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
|
220
|
+
params[k] << v
|
|
221
|
+
elsif after =~ %r(^\[\]\[([^\[\]]+)\]$) || after =~ %r(^\[\](.+)$)
|
|
222
|
+
child_key = $1
|
|
223
|
+
params[k] ||= []
|
|
224
|
+
raise TypeError, "expected Array (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Array)
|
|
225
|
+
if params[k].last.is_a?(Hash) && !params[k].last.key?(child_key)
|
|
226
|
+
normalize_params(params[k].last, child_key, v)
|
|
227
|
+
else
|
|
228
|
+
params[k] << normalize_params({}, child_key, v)
|
|
229
|
+
end
|
|
230
|
+
else
|
|
231
|
+
params[k] ||= {}
|
|
232
|
+
raise TypeError, "expected Hash (got #{params[k].class.name}) for param `#{k}'" unless params[k].is_a?(Hash)
|
|
233
|
+
params[k] = normalize_params(params[k], after, v)
|
|
86
234
|
end
|
|
235
|
+
|
|
236
|
+
return params
|
|
87
237
|
end
|
|
88
238
|
|
|
89
239
|
# Receives a URL and returns just the path with the query string sorted.
|
|
@@ -92,6 +242,23 @@ module Faraday
|
|
|
92
242
|
(url.query ? "?#{sort_query_params(url.query)}" : "")
|
|
93
243
|
end
|
|
94
244
|
|
|
245
|
+
# Recursive hash update
|
|
246
|
+
def deep_merge!(target, hash)
|
|
247
|
+
hash.each do |key, value|
|
|
248
|
+
if Hash === value and Hash === target[key]
|
|
249
|
+
target[key] = deep_merge(target[key], value)
|
|
250
|
+
else
|
|
251
|
+
target[key] = value
|
|
252
|
+
end
|
|
253
|
+
end
|
|
254
|
+
target
|
|
255
|
+
end
|
|
256
|
+
|
|
257
|
+
# Recursive hash merge
|
|
258
|
+
def deep_merge(source, hash)
|
|
259
|
+
deep_merge!(source.dup, hash)
|
|
260
|
+
end
|
|
261
|
+
|
|
95
262
|
protected
|
|
96
263
|
|
|
97
264
|
def sort_query_params(query)
|
data/lib/faraday.rb
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
module Faraday
|
|
2
|
-
VERSION = "0.
|
|
2
|
+
VERSION = "0.8.0"
|
|
3
3
|
|
|
4
4
|
class << self
|
|
5
|
+
attr_accessor :root_path, :lib_path
|
|
5
6
|
attr_accessor :default_adapter
|
|
6
7
|
attr_writer :default_connection
|
|
7
8
|
|
|
@@ -10,29 +11,63 @@ module Faraday
|
|
|
10
11
|
Faraday::Connection.new(url, options, &block)
|
|
11
12
|
end
|
|
12
13
|
|
|
14
|
+
def require_libs(*libs)
|
|
15
|
+
libs.each do |lib|
|
|
16
|
+
require "#{lib_path}/#{lib}"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
alias require_lib require_libs
|
|
21
|
+
|
|
13
22
|
private
|
|
14
23
|
def method_missing(name, *args, &block)
|
|
15
24
|
default_connection.send(name, *args, &block)
|
|
16
25
|
end
|
|
17
26
|
end
|
|
18
27
|
|
|
28
|
+
self.root_path = File.expand_path "..", __FILE__
|
|
29
|
+
self.lib_path = File.expand_path "../faraday", __FILE__
|
|
19
30
|
self.default_adapter = :net_http
|
|
20
31
|
|
|
21
32
|
def self.default_connection
|
|
22
33
|
@default_connection ||= Connection.new
|
|
23
34
|
end
|
|
24
35
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
36
|
+
begin
|
|
37
|
+
require RUBY_VERSION < '1.9' ? 'system_timer' : 'timeout'
|
|
38
|
+
rescue LoadError
|
|
39
|
+
require 'timeout'
|
|
40
|
+
warn "Faraday: you may want to install system_timer for reliable timeouts"
|
|
41
|
+
ensure
|
|
42
|
+
Timer = defined?(::SystemTimer) ? ::SystemTimer : ::Timeout
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
module MiddlewareRegistry
|
|
46
|
+
# Internal: Register middleware class(es) on the current module.
|
|
47
|
+
#
|
|
48
|
+
# mapping - A Hash mapping Symbol keys to classes. See
|
|
49
|
+
# Faraday.register_middleware for more details.
|
|
50
|
+
def register_middleware(mapping)
|
|
51
|
+
(@registered_middleware ||= {}).update(mapping)
|
|
28
52
|
end
|
|
29
53
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
54
|
+
# Internal: Lookup middleware class with a registered Symbol shortcut.
|
|
55
|
+
#
|
|
56
|
+
# Returns a middleware Class.
|
|
57
|
+
def lookup_middleware(key)
|
|
58
|
+
unless defined? @registered_middleware and found = @registered_middleware[key]
|
|
59
|
+
raise "#{key.inspect} is not registered on #{self}"
|
|
60
|
+
end
|
|
61
|
+
found = @registered_middleware[key] = found.call if found.is_a? Proc
|
|
62
|
+
found.is_a?(Module) ? found : const_get(found)
|
|
33
63
|
end
|
|
64
|
+
end
|
|
34
65
|
|
|
66
|
+
module AutoloadHelper
|
|
35
67
|
def autoload_all(prefix, options)
|
|
68
|
+
if prefix =~ /^faraday(\/|$)/i
|
|
69
|
+
prefix = File.join(Faraday.root_path, prefix)
|
|
70
|
+
end
|
|
36
71
|
options.each do |const_name, path|
|
|
37
72
|
autoload const_name, File.join(prefix, path)
|
|
38
73
|
end
|
|
@@ -54,7 +89,30 @@ module Faraday
|
|
|
54
89
|
|
|
55
90
|
extend AutoloadHelper
|
|
56
91
|
|
|
57
|
-
|
|
92
|
+
# Public: register middleware classes under a short name.
|
|
93
|
+
#
|
|
94
|
+
# type - A Symbol specifying the kind of middleware (default: :middleware)
|
|
95
|
+
# mapping - A Hash mapping Symbol keys to classes. Classes can be expressed
|
|
96
|
+
# as fully qualified constant, or a Proc that will be lazily called
|
|
97
|
+
# to return the former.
|
|
98
|
+
#
|
|
99
|
+
# Examples
|
|
100
|
+
#
|
|
101
|
+
# Faraday.register_middleware :aloha => MyModule::Aloha
|
|
102
|
+
# Faraday.register_middleware :response, :boom => MyModule::Boom
|
|
103
|
+
#
|
|
104
|
+
# # shortcuts are now available in Builder:
|
|
105
|
+
# builder.use :aloha
|
|
106
|
+
# builder.response :boom
|
|
107
|
+
#
|
|
108
|
+
# Returns nothing.
|
|
109
|
+
def self.register_middleware type, mapping = nil
|
|
110
|
+
type, mapping = :middleware, type if mapping.nil?
|
|
111
|
+
component = self.const_get(type.to_s.capitalize)
|
|
112
|
+
component.register_middleware(mapping)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
autoload_all "faraday",
|
|
58
116
|
:Middleware => 'middleware',
|
|
59
117
|
:Builder => 'builder',
|
|
60
118
|
:Request => 'request',
|
|
@@ -62,14 +120,12 @@ module Faraday
|
|
|
62
120
|
:CompositeReadIO => 'upload_io',
|
|
63
121
|
:UploadIO => 'upload_io',
|
|
64
122
|
:Parts => 'upload_io'
|
|
123
|
+
|
|
124
|
+
require_libs "utils", "connection", "adapter", "error"
|
|
65
125
|
end
|
|
66
126
|
|
|
67
|
-
require 'faraday/utils'
|
|
68
|
-
require 'faraday/connection'
|
|
69
|
-
require 'faraday/adapter'
|
|
70
|
-
require 'faraday/error'
|
|
71
127
|
|
|
72
|
-
# not pulling in active-support JUST for this method.
|
|
128
|
+
# not pulling in active-support JUST for this method. And I love this method.
|
|
73
129
|
class Object
|
|
74
130
|
# Yields <code>x</code> to the block, and then returns <code>x</code>.
|
|
75
131
|
# The primary purpose of this method is to "tap into" a method chain,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require File.expand_path('../integration', __FILE__)
|
|
2
|
+
|
|
3
|
+
module Adapters
|
|
4
|
+
class DefaultTest < Faraday::TestCase
|
|
5
|
+
|
|
6
|
+
def adapter() :default end
|
|
7
|
+
|
|
8
|
+
Integration.apply(self, :NonParallel) do
|
|
9
|
+
# default stack is not configured with Multipart
|
|
10
|
+
undef :test_POST_sends_files
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require File.expand_path('../integration', __FILE__)
|
|
2
|
+
|
|
3
|
+
module Adapters
|
|
4
|
+
class EMHttpTest < Faraday::TestCase
|
|
5
|
+
|
|
6
|
+
def adapter() :em_http end
|
|
7
|
+
|
|
8
|
+
Integration.apply(self, :Parallel) do
|
|
9
|
+
# https://github.com/eventmachine/eventmachine/pull/289
|
|
10
|
+
undef :test_timeout
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
require File.expand_path('../integration', __FILE__)
|
|
2
|
+
|
|
3
|
+
module Adapters
|
|
4
|
+
class EMSynchronyTest < Faraday::TestCase
|
|
5
|
+
|
|
6
|
+
def adapter() :em_synchrony end
|
|
7
|
+
|
|
8
|
+
Integration.apply(self, :Parallel) do
|
|
9
|
+
# https://github.com/eventmachine/eventmachine/pull/289
|
|
10
|
+
undef :test_timeout
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
end unless RUBY_VERSION < '1.9' or (defined? RUBY_ENGINE and 'jruby' == RUBY_ENGINE)
|
|
14
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require File.expand_path('../integration', __FILE__)
|
|
2
|
+
|
|
3
|
+
module Adapters
|
|
4
|
+
class ExconTest < Faraday::TestCase
|
|
5
|
+
|
|
6
|
+
def adapter() :excon end
|
|
7
|
+
|
|
8
|
+
# https://github.com/geemus/excon/issues/98
|
|
9
|
+
if defined?(RUBY_ENGINE) and "rbx" == RUBY_ENGINE
|
|
10
|
+
warn "Warning: Skipping Excon tests on Rubinius"
|
|
11
|
+
else
|
|
12
|
+
Integration.apply(self, :NonParallel) do
|
|
13
|
+
# https://github.com/eventmachine/eventmachine/pull/289
|
|
14
|
+
undef :test_timeout
|
|
15
|
+
|
|
16
|
+
# FIXME: this test fails on Travis with
|
|
17
|
+
# "Faraday::Error::ClientError: the server responded with status 400"
|
|
18
|
+
undef :test_POST_sends_files if ENV['CI']
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|