faraday 0.8.0 → 0.8.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -16
- data/faraday.gemspec +1 -1
- data/lib/faraday.rb +12 -7
- data/lib/faraday/adapter/em_http.rb +64 -61
- data/lib/faraday/adapter/em_synchrony.rb +4 -31
- data/lib/faraday/adapter/excon.rb +1 -1
- data/test/helper.rb +3 -1
- metadata +38 -13
data/README.md
CHANGED
@@ -17,7 +17,7 @@ Faraday supports these adapters:
|
|
17
17
|
It also includes a Rack adapter for hitting loaded Rack applications through
|
18
18
|
Rack::Test, and a Test adapter for stubbing requests by hand.
|
19
19
|
|
20
|
-
##
|
20
|
+
## Usage
|
21
21
|
|
22
22
|
```ruby
|
23
23
|
conn = Faraday.new(:url => 'http://sushi.com') do |builder|
|
@@ -58,15 +58,8 @@ end
|
|
58
58
|
|
59
59
|
conn.get do |req|
|
60
60
|
req.url '/search'
|
61
|
-
req.options =
|
62
|
-
|
63
|
-
:open_timeout => 2, # read timeout Integer in seconds
|
64
|
-
:proxy => {
|
65
|
-
:uri => "http://example.org/", # proxy server URI
|
66
|
-
:user => "me", # proxy server username
|
67
|
-
:password => "test123" # proxy server password
|
68
|
-
}
|
69
|
-
}
|
61
|
+
req.options[:timeout] = 5 # open/read timeout in seconds
|
62
|
+
req.options[:open_timeout] = 2 # connection open timeout in seconds
|
70
63
|
end
|
71
64
|
```
|
72
65
|
|
@@ -149,7 +142,7 @@ later, response. Some keys are:
|
|
149
142
|
:response_headers
|
150
143
|
```
|
151
144
|
|
152
|
-
##
|
145
|
+
## Testing
|
153
146
|
|
154
147
|
```ruby
|
155
148
|
# It's possible to define stubbed request outside a test adapter block.
|
@@ -184,11 +177,11 @@ resp = test.get '/else' #=> raises "no such stub" error
|
|
184
177
|
stubs.verify_stubbed_calls
|
185
178
|
```
|
186
179
|
|
187
|
-
##
|
180
|
+
## TODO
|
188
181
|
* support streaming requests/responses
|
189
182
|
* better stubbing API
|
190
183
|
|
191
|
-
##
|
184
|
+
## Note on Patches/Pull Requests
|
192
185
|
1. Fork the project.
|
193
186
|
2. Make your feature addition or bug fix.
|
194
187
|
3. Add tests for it. This is important so I don't break it in a future version
|
@@ -202,7 +195,7 @@ We are pushing towards a 1.0 release, when we will have to follow [Semantic
|
|
202
195
|
Versioning](http://semver.org/). If your patch includes changes to break
|
203
196
|
compatiblitity, note that so we can add it to the [Changelog](https://github.com/technoweenie/faraday/wiki/Changelog).
|
204
197
|
|
205
|
-
##
|
198
|
+
## Supported Ruby Versions
|
206
199
|
This library aims to support and is [tested against][travis] the following Ruby
|
207
200
|
implementations:
|
208
201
|
|
@@ -229,8 +222,8 @@ implementation, you will be personally responsible for providing patches in a
|
|
229
222
|
timely fashion. If critical issues for a particular implementation exist at the
|
230
223
|
time of a major release, support for that Ruby version may be dropped.
|
231
224
|
|
232
|
-
##
|
233
|
-
Copyright (c) 2009-
|
225
|
+
## Copyright
|
226
|
+
Copyright (c) 2009-2012 [Rick Olson](mailto:technoweenie@gmail.com), zack hobson.
|
234
227
|
See [LICENSE][] for details.
|
235
228
|
|
236
229
|
[license]: https://github.com/technoweenie/faraday/blob/master/LICENSE.md
|
data/faraday.gemspec
CHANGED
@@ -3,7 +3,7 @@ Gem::Specification.new do |s|
|
|
3
3
|
s.required_rubygems_version = Gem::Requirement.new(">= 1.3.5") if s.respond_to? :required_rubygems_version=
|
4
4
|
|
5
5
|
s.name = 'faraday'
|
6
|
-
s.version = '0.8.
|
6
|
+
s.version = '0.8.1'
|
7
7
|
|
8
8
|
s.summary = "HTTP/REST API client library."
|
9
9
|
# TODO: s.description
|
data/lib/faraday.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Faraday
|
2
|
-
VERSION = "0.8.
|
2
|
+
VERSION = "0.8.1"
|
3
3
|
|
4
4
|
class << self
|
5
5
|
attr_accessor :root_path, :lib_path
|
@@ -33,13 +33,18 @@ module Faraday
|
|
33
33
|
@default_connection ||= Connection.new
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
36
|
+
if (!defined?(RUBY_ENGINE) || "ruby" == RUBY_ENGINE) && RUBY_VERSION < '1.9'
|
37
|
+
begin
|
38
|
+
require 'system_timer'
|
39
|
+
Timer = SystemTimer
|
40
|
+
rescue LoadError
|
41
|
+
warn "Faraday: you may want to install system_timer for reliable timeouts"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
unless const_defined? :Timer
|
39
46
|
require 'timeout'
|
40
|
-
|
41
|
-
ensure
|
42
|
-
Timer = defined?(::SystemTimer) ? ::SystemTimer : ::Timeout
|
47
|
+
Timer = Timeout
|
43
48
|
end
|
44
49
|
|
45
50
|
module MiddlewareRegistry
|
@@ -4,6 +4,70 @@ module Faraday
|
|
4
4
|
# when in EM reactor loop or for making parallel requests in
|
5
5
|
# synchronous code.
|
6
6
|
class EMHttp < Faraday::Adapter
|
7
|
+
module Options
|
8
|
+
def connection_config(env)
|
9
|
+
options = {}
|
10
|
+
configure_ssl(options, env)
|
11
|
+
configure_proxy(options, env)
|
12
|
+
configure_timeout(options, env)
|
13
|
+
options
|
14
|
+
end
|
15
|
+
|
16
|
+
def request_config(env)
|
17
|
+
options = {
|
18
|
+
:body => read_body(env),
|
19
|
+
:head => env[:request_headers],
|
20
|
+
# :keepalive => true,
|
21
|
+
# :file => 'path/to/file', # stream data off disk
|
22
|
+
}
|
23
|
+
configure_compression(options, env)
|
24
|
+
# configure_proxy_auth
|
25
|
+
# :proxy => {:authorization => [user, pass]}
|
26
|
+
# proxy[:username] && proxy[:password]
|
27
|
+
options
|
28
|
+
end
|
29
|
+
|
30
|
+
def read_body(env)
|
31
|
+
body = env[:body]
|
32
|
+
body.respond_to?(:read) ? body.read : body
|
33
|
+
end
|
34
|
+
|
35
|
+
def configure_ssl(options, env)
|
36
|
+
if ssl = env[:ssl]
|
37
|
+
# :ssl => {
|
38
|
+
# :private_key_file => '/tmp/server.key',
|
39
|
+
# :cert_chain_file => '/tmp/server.crt',
|
40
|
+
# :verify_peer => false
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def configure_proxy(options, env)
|
45
|
+
if proxy = request_options(env)[:proxy]
|
46
|
+
options[:proxy] = {
|
47
|
+
:host => proxy[:uri].host,
|
48
|
+
:port => proxy[:uri].port
|
49
|
+
}
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def configure_timeout(options, env)
|
54
|
+
timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
|
55
|
+
options[:connect_timeout] = options[:inactivity_timeout] = timeout
|
56
|
+
options[:connect_timeout] = open_timeout if open_timeout
|
57
|
+
end
|
58
|
+
|
59
|
+
def configure_compression(options, env)
|
60
|
+
if env[:method] == :get and not options[:head].key? 'accept-encoding'
|
61
|
+
options[:head]['accept-encoding'] = 'gzip, compressed'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def request_options(env)
|
66
|
+
env[:request]
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
include Options
|
7
71
|
|
8
72
|
dependency 'em-http'
|
9
73
|
|
@@ -80,67 +144,6 @@ module Faraday
|
|
80
144
|
raise errklass, msg
|
81
145
|
end
|
82
146
|
|
83
|
-
def connection_config(env)
|
84
|
-
options = {}
|
85
|
-
configure_ssl(options, env)
|
86
|
-
configure_proxy(options, env)
|
87
|
-
configure_timeout(options, env)
|
88
|
-
options
|
89
|
-
end
|
90
|
-
|
91
|
-
def request_config(env)
|
92
|
-
options = {
|
93
|
-
:body => read_body(env),
|
94
|
-
:head => env[:request_headers],
|
95
|
-
# :keepalive => true,
|
96
|
-
# :file => 'path/to/file', # stream data off disk
|
97
|
-
}
|
98
|
-
configure_compression(options, env)
|
99
|
-
# configure_proxy_auth
|
100
|
-
# :proxy => {:authorization => [user, pass]}
|
101
|
-
# proxy[:username] && proxy[:password]
|
102
|
-
options
|
103
|
-
end
|
104
|
-
|
105
|
-
def read_body(env)
|
106
|
-
body = env[:body]
|
107
|
-
body.respond_to?(:read) ? body.read : body
|
108
|
-
end
|
109
|
-
|
110
|
-
def configure_ssl(options, env)
|
111
|
-
if ssl = env[:ssl]
|
112
|
-
# :ssl => {
|
113
|
-
# :private_key_file => '/tmp/server.key',
|
114
|
-
# :cert_chain_file => '/tmp/server.crt',
|
115
|
-
# :verify_peer => false
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
def configure_proxy(options, env)
|
120
|
-
if proxy = request_options(env)[:proxy]
|
121
|
-
options[:proxy] = {
|
122
|
-
:host => proxy[:uri].host,
|
123
|
-
:port => proxy[:uri].port
|
124
|
-
}
|
125
|
-
end
|
126
|
-
end
|
127
|
-
|
128
|
-
def configure_timeout(options, env)
|
129
|
-
timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
|
130
|
-
options[:connect_timeout] = options[:inactivity_timeout] = timeout
|
131
|
-
options[:connect_timeout] = open_timeout if open_timeout
|
132
|
-
end
|
133
|
-
|
134
|
-
def configure_compression(options, env)
|
135
|
-
if env[:method] == :get and not options[:head].key? 'accept-encoding'
|
136
|
-
options[:head]['accept-encoding'] = 'gzip, compressed'
|
137
|
-
end
|
138
|
-
end
|
139
|
-
|
140
|
-
def request_options(env)
|
141
|
-
env[:request]
|
142
|
-
end
|
143
|
-
|
144
147
|
def parallel?(env)
|
145
148
|
!!env[:parallel_manager]
|
146
149
|
end
|
@@ -3,6 +3,7 @@ require 'uri'
|
|
3
3
|
module Faraday
|
4
4
|
class Adapter
|
5
5
|
class EMSynchrony < Faraday::Adapter
|
6
|
+
include EMHttp::Options
|
6
7
|
|
7
8
|
dependency do
|
8
9
|
require 'em-synchrony/em-http'
|
@@ -18,41 +19,13 @@ module Faraday
|
|
18
19
|
|
19
20
|
def call(env)
|
20
21
|
super
|
21
|
-
request = EventMachine::HttpRequest.new(URI::parse(env[:url].to_s))
|
22
|
-
options = {:head => env[:request_headers]}
|
23
|
-
options[:ssl] = env[:ssl] if env[:ssl]
|
24
|
-
|
25
|
-
if env[:body]
|
26
|
-
if env[:body].respond_to? :read
|
27
|
-
options[:body] = env[:body].read
|
28
|
-
else
|
29
|
-
options[:body] = env[:body]
|
30
|
-
end
|
31
|
-
end
|
32
|
-
|
33
|
-
if req = env[:request]
|
34
|
-
if proxy = req[:proxy]
|
35
|
-
uri = URI.parse(proxy[:uri])
|
36
|
-
options[:proxy] = {
|
37
|
-
:host => uri.host,
|
38
|
-
:port => uri.port
|
39
|
-
}
|
40
|
-
if proxy[:username] && proxy[:password]
|
41
|
-
options[:proxy][:authorization] = [proxy[:username], proxy[:password]]
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
# only one timeout currently supported by em http request
|
46
|
-
if req[:timeout] or req[:open_timeout]
|
47
|
-
options[:timeout] = [req[:timeout] || 0, req[:open_timeout] || 0].max
|
48
|
-
end
|
49
|
-
end
|
22
|
+
request = EventMachine::HttpRequest.new(URI::parse(env[:url].to_s), connection_config(env)) # end
|
50
23
|
|
51
24
|
http_method = env[:method].to_s.downcase.to_sym
|
52
25
|
|
53
26
|
# Queue requests for parallel execution.
|
54
27
|
if env[:parallel_manager]
|
55
|
-
env[:parallel_manager].add(request, http_method,
|
28
|
+
env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
|
56
29
|
save_response(env, resp.response_header.status, resp.response) do |resp_headers|
|
57
30
|
resp.response_header.each do |name, value|
|
58
31
|
resp_headers[name.to_sym] = value
|
@@ -66,7 +39,7 @@ module Faraday
|
|
66
39
|
# Execute single request.
|
67
40
|
else
|
68
41
|
client = nil
|
69
|
-
block = lambda { request.send(http_method,
|
42
|
+
block = lambda { request.send(http_method, request_config(env)) }
|
70
43
|
|
71
44
|
if !EM.reactor_running?
|
72
45
|
EM.run do
|
@@ -7,7 +7,7 @@ module Faraday
|
|
7
7
|
super
|
8
8
|
|
9
9
|
conn = ::Excon.new(env[:url].to_s)
|
10
|
-
if
|
10
|
+
if env[:url].scheme == 'https' && ssl = env[:ssl]
|
11
11
|
::Excon.ssl_verify_peer = !!ssl.fetch(:verify, true)
|
12
12
|
::Excon.ssl_ca_path = ssl[:ca_file] if ssl[:ca_file]
|
13
13
|
end
|
data/test/helper.rb
CHANGED
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.8.
|
4
|
+
version: 0.8.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-05-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: multipart-post
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: '1.1'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '1.1'
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: rake
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ! '>='
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: '0'
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: simplecov
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ! '>='
|
@@ -43,10 +53,15 @@ dependencies:
|
|
43
53
|
version: '0'
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
47
62
|
- !ruby/object:Gem::Dependency
|
48
63
|
name: test-unit
|
49
|
-
requirement:
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
50
65
|
none: false
|
51
66
|
requirements:
|
52
67
|
- - ! '>='
|
@@ -54,10 +69,15 @@ dependencies:
|
|
54
69
|
version: '0'
|
55
70
|
type: :development
|
56
71
|
prerelease: false
|
57
|
-
version_requirements:
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
58
78
|
- !ruby/object:Gem::Dependency
|
59
79
|
name: webmock
|
60
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
61
81
|
none: false
|
62
82
|
requirements:
|
63
83
|
- - ! '>='
|
@@ -65,7 +85,12 @@ dependencies:
|
|
65
85
|
version: '0'
|
66
86
|
type: :development
|
67
87
|
prerelease: false
|
68
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
69
94
|
description:
|
70
95
|
email: technoweenie@gmail.com
|
71
96
|
executables: []
|
@@ -147,7 +172,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
172
|
version: 1.3.5
|
148
173
|
requirements: []
|
149
174
|
rubyforge_project:
|
150
|
-
rubygems_version: 1.8.
|
175
|
+
rubygems_version: 1.8.24
|
151
176
|
signing_key:
|
152
177
|
specification_version: 2
|
153
178
|
summary: HTTP/REST API client library.
|