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
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
module Faraday
|
|
2
|
-
class Adapter
|
|
3
|
-
class ActionDispatch < Faraday::Adapter
|
|
4
|
-
attr_reader :session
|
|
5
|
-
|
|
6
|
-
# Initializes a new middleware instance for each request. Instead of
|
|
7
|
-
# initiating an HTTP request with a web server, this adapter calls
|
|
8
|
-
# a Rails 3 app using integration tests.
|
|
9
|
-
#
|
|
10
|
-
# app - The current Faraday request.
|
|
11
|
-
# session - An ActionDispatch::Integration::Session instance.
|
|
12
|
-
#
|
|
13
|
-
# Returns nothing.
|
|
14
|
-
def initialize(app, session)
|
|
15
|
-
super(app)
|
|
16
|
-
@session = session
|
|
17
|
-
@session.reset!
|
|
18
|
-
end
|
|
19
|
-
|
|
20
|
-
def call(env)
|
|
21
|
-
super
|
|
22
|
-
@session.__send__(env[:method], env[:url].request_uri, env[:body], env[:request_headers])
|
|
23
|
-
resp = @session.response
|
|
24
|
-
env.update :status => resp.status, :body => resp.body
|
|
25
|
-
response_headers(env).update resp.headers
|
|
26
|
-
@app.call env
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
end
|
data/lib/faraday/request/json.rb
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
module Faraday
|
|
2
|
-
class Request::JSON < Request::UrlEncoded
|
|
3
|
-
self.mime_type = 'application/json'.freeze
|
|
4
|
-
|
|
5
|
-
class << self
|
|
6
|
-
attr_accessor :adapter
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
# loads the JSON encoder either from yajl-ruby or activesupport
|
|
10
|
-
dependency do
|
|
11
|
-
begin
|
|
12
|
-
require 'yajl'
|
|
13
|
-
self.adapter = Yajl::Encoder
|
|
14
|
-
rescue LoadError, NameError
|
|
15
|
-
require 'active_support/core_ext/module/attribute_accessors' # AS 2.3.11
|
|
16
|
-
require 'active_support/core_ext/kernel/reporting' # AS 2.3.11
|
|
17
|
-
require 'active_support/json/encoding'
|
|
18
|
-
require 'active_support/ordered_hash' # AS 3.0.4
|
|
19
|
-
self.adapter = ActiveSupport::JSON
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
|
|
23
|
-
def call(env)
|
|
24
|
-
match_content_type(env) do |data|
|
|
25
|
-
# encode with the first successfully loaded adapter
|
|
26
|
-
env[:body] = self.class.adapter.encode data
|
|
27
|
-
end
|
|
28
|
-
@app.call env
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
data/test/adapters/live_test.rb
DELETED
|
@@ -1,186 +0,0 @@
|
|
|
1
|
-
require File.expand_path(File.join(File.dirname(__FILE__), '..', 'helper'))
|
|
2
|
-
|
|
3
|
-
if !Faraday::TestCase::LIVE_SERVER
|
|
4
|
-
warn "warning: test server is not up; skipping live server tests"
|
|
5
|
-
else
|
|
6
|
-
module Adapters
|
|
7
|
-
class LiveTest < Faraday::TestCase
|
|
8
|
-
adapters = if ENV['ADAPTER']
|
|
9
|
-
ENV['ADAPTER'].split(':').map { |name| Faraday::Adapter.lookup_module name.to_sym }
|
|
10
|
-
else
|
|
11
|
-
loaded_adapters = Faraday::Adapter.all_loaded_constants
|
|
12
|
-
loaded_adapters -= [Faraday::Adapter::ActionDispatch]
|
|
13
|
-
loaded_adapters << :default
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
adapters.each do |adapter|
|
|
17
|
-
define_method "test_#{adapter}_GET_retrieves_the_response_body" do
|
|
18
|
-
assert_equal 'hello world', create_connection(adapter).get('hello_world').body
|
|
19
|
-
end
|
|
20
|
-
|
|
21
|
-
define_method "test_#{adapter}_GET_send_url_encoded_params" do
|
|
22
|
-
resp = create_connection(adapter).get do |req|
|
|
23
|
-
req.url 'hello', 'name' => 'zack'
|
|
24
|
-
end
|
|
25
|
-
assert_equal('hello zack', resp.body)
|
|
26
|
-
end
|
|
27
|
-
|
|
28
|
-
define_method "test_#{adapter}_GET_retrieves_the_response_headers" do
|
|
29
|
-
response = create_connection(adapter).get('hello_world')
|
|
30
|
-
assert_match /text\/html/, response.headers['Content-Type'], 'original case fail'
|
|
31
|
-
assert_match /text\/html/, response.headers['content-type'], 'lowercase fail'
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
# https://github.com/geemus/excon/issues/10
|
|
35
|
-
unless %[Faraday::Adapter::Excon] == adapter.to_s
|
|
36
|
-
define_method "test_#{adapter}_GET_handles_headers_with_multiple_values" do
|
|
37
|
-
response = create_connection(adapter).get('multi')
|
|
38
|
-
assert_equal 'one, two', response.headers['set-cookie']
|
|
39
|
-
end
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
define_method "test_#{adapter}_POST_send_url_encoded_params" do
|
|
43
|
-
resp = create_connection(adapter).post do |req|
|
|
44
|
-
req.url 'echo_name'
|
|
45
|
-
req.body = {'name' => 'zack'}
|
|
46
|
-
end
|
|
47
|
-
assert_equal %("zack"), resp.body
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
define_method "test_#{adapter}_POST_send_url_encoded_nested_params" do
|
|
51
|
-
resp = create_connection(adapter).post do |req|
|
|
52
|
-
req.url 'echo_name'
|
|
53
|
-
req.body = {'name' => {'first' => 'zack'}}
|
|
54
|
-
end
|
|
55
|
-
assert_equal %({"first"=>"zack"}), resp.body
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
define_method "test_#{adapter}_POST_retrieves_the_response_headers" do
|
|
59
|
-
assert_match /text\/html/, create_connection(adapter).post('echo_name').headers['content-type']
|
|
60
|
-
end
|
|
61
|
-
|
|
62
|
-
define_method "test_#{adapter}_POST_sends_files" do
|
|
63
|
-
resp = create_connection(adapter).post do |req|
|
|
64
|
-
req.url 'file'
|
|
65
|
-
req.body = {'uploaded_file' => Faraday::UploadIO.new(__FILE__, 'text/x-ruby')}
|
|
66
|
-
end
|
|
67
|
-
assert_equal "file live_test.rb text/x-ruby", resp.body
|
|
68
|
-
end unless :default == adapter # isn't configured for multipart
|
|
69
|
-
|
|
70
|
-
# http://github.com/toland/patron/issues/#issue/9
|
|
71
|
-
if ENV['FORCE'] || adapter != Faraday::Adapter::Patron
|
|
72
|
-
define_method "test_#{adapter}_PUT_send_url_encoded_params" do
|
|
73
|
-
resp = create_connection(adapter).put do |req|
|
|
74
|
-
req.url 'echo_name'
|
|
75
|
-
req.body = {'name' => 'zack'}
|
|
76
|
-
end
|
|
77
|
-
assert_equal %("zack"), resp.body
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
define_method "test_#{adapter}_PUT_send_url_encoded_nested_params" do
|
|
81
|
-
resp = create_connection(adapter).put do |req|
|
|
82
|
-
req.url 'echo_name'
|
|
83
|
-
req.body = {'name' => {'first' => 'zack'}}
|
|
84
|
-
end
|
|
85
|
-
assert_equal %({"first"=>"zack"}), resp.body
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
define_method "test_#{adapter}_PUT_retrieves_the_response_headers" do
|
|
89
|
-
assert_match /text\/html/, create_connection(adapter).put('echo_name').headers['content-type']
|
|
90
|
-
end
|
|
91
|
-
end
|
|
92
|
-
|
|
93
|
-
define_method "test_#{adapter}_HEAD_send_url_encoded_params" do
|
|
94
|
-
resp = create_connection(adapter).head do |req|
|
|
95
|
-
req.url 'hello', 'name' => 'zack'
|
|
96
|
-
end
|
|
97
|
-
assert_match /text\/html/, resp.headers['content-type']
|
|
98
|
-
end
|
|
99
|
-
|
|
100
|
-
define_method "test_#{adapter}_HEAD_retrieves_no_response_body" do
|
|
101
|
-
assert_equal '', create_connection(adapter).head('hello_world').body.to_s
|
|
102
|
-
end
|
|
103
|
-
|
|
104
|
-
define_method "test_#{adapter}_HEAD_retrieves_the_response_headers" do
|
|
105
|
-
assert_match /text\/html/, create_connection(adapter).head('hello_world').headers['content-type']
|
|
106
|
-
end
|
|
107
|
-
|
|
108
|
-
define_method "test_#{adapter}_DELETE_retrieves_the_response_headers" do
|
|
109
|
-
assert_match /text\/html/, create_connection(adapter).delete('delete_with_json').headers['content-type']
|
|
110
|
-
end
|
|
111
|
-
|
|
112
|
-
define_method "test_#{adapter}_DELETE_retrieves_the_body" do
|
|
113
|
-
assert_match /deleted/, create_connection(adapter).delete('delete_with_json').body
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
define_method "test_#{adapter}_async_requests_clear_parallel_manager_after_running_a_single_request" do
|
|
117
|
-
connection = create_connection(adapter)
|
|
118
|
-
assert !connection.in_parallel?
|
|
119
|
-
resp = connection.get('hello_world')
|
|
120
|
-
assert !connection.in_parallel?
|
|
121
|
-
assert_equal 'hello world', connection.get('hello_world').body
|
|
122
|
-
end
|
|
123
|
-
|
|
124
|
-
define_method "test_#{adapter}_async_requests_uses_parallel_manager_to_run_multiple_json_requests" do
|
|
125
|
-
resp1, resp2 = nil, nil
|
|
126
|
-
|
|
127
|
-
connection = create_connection(adapter)
|
|
128
|
-
adapter = real_adapter_for(adapter)
|
|
129
|
-
|
|
130
|
-
connection.in_parallel(adapter.setup_parallel_manager) do
|
|
131
|
-
resp1 = connection.get('json')
|
|
132
|
-
resp2 = connection.get('json')
|
|
133
|
-
if adapter.supports_parallel_requests?
|
|
134
|
-
assert connection.in_parallel?
|
|
135
|
-
assert_nil resp1.body
|
|
136
|
-
assert_nil resp2.body
|
|
137
|
-
end
|
|
138
|
-
end
|
|
139
|
-
assert !connection.in_parallel?
|
|
140
|
-
assert_equal '[1,2,3]', resp1.body
|
|
141
|
-
assert_equal '[1,2,3]', resp2.body
|
|
142
|
-
end
|
|
143
|
-
|
|
144
|
-
if adapter.to_s == "Faraday::Adapter::EMSynchrony"
|
|
145
|
-
instance_methods.grep(%r{Faraday::Adapter::EMSynchrony}).each do |method|
|
|
146
|
-
em = method.to_s.sub %r{^test_}, "test_under_em_"
|
|
147
|
-
define_method em do
|
|
148
|
-
EM.run do
|
|
149
|
-
Fiber.new do
|
|
150
|
-
self.send method
|
|
151
|
-
EM.stop
|
|
152
|
-
end.resume
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
end
|
|
156
|
-
end
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
def create_connection(adapter)
|
|
160
|
-
if adapter == :default
|
|
161
|
-
Faraday.default_connection.tap do |conn|
|
|
162
|
-
conn.url_prefix = LIVE_SERVER
|
|
163
|
-
conn.headers['X-Faraday-Adapter'] = adapter.to_s
|
|
164
|
-
end
|
|
165
|
-
else
|
|
166
|
-
Faraday::Connection.new LIVE_SERVER, :headers => {'X-Faraday-Adapter' => adapter.to_s} do |b|
|
|
167
|
-
b.request :multipart
|
|
168
|
-
b.request :url_encoded
|
|
169
|
-
b.use adapter
|
|
170
|
-
end
|
|
171
|
-
end.tap do |conn|
|
|
172
|
-
target = conn.builder.handlers.last
|
|
173
|
-
conn.builder.insert_before target, Faraday::Response::RaiseError
|
|
174
|
-
end
|
|
175
|
-
end
|
|
176
|
-
|
|
177
|
-
def real_adapter_for(adapter)
|
|
178
|
-
if adapter == :default
|
|
179
|
-
Faraday::Adapter.lookup_module(Faraday.default_adapter)
|
|
180
|
-
else
|
|
181
|
-
adapter
|
|
182
|
-
end
|
|
183
|
-
end
|
|
184
|
-
end
|
|
185
|
-
end
|
|
186
|
-
end
|