faraday 0.10.0 → 0.12.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fc2292832e97072ea9b3292a56ee1c87e7f9ec19
4
- data.tar.gz: 9aea82166ae97ea282ba1a4b5efc4740effeea14
3
+ metadata.gz: d6ed59b880f0d605e4efc8ce513ced0b4688c4ef
4
+ data.tar.gz: 21d3a0326416db1e19add553b8d5c0ef1c5a3b50
5
5
  SHA512:
6
- metadata.gz: ba7bc351e2111733af22e1666f86d877050cd3256d3322e0418773aaf1a8c7447a02a780b812b0f2549b558c4c38a606189dad3c2915ed48019def848b8bc65c
7
- data.tar.gz: d3cbb3fa12d1e37f162930bab8be286ca6b384e2ce622e8ebff9087386902b50aa318a423d054138d87064601034470a45d072c85bda910d29fbb84150a22a5f
6
+ metadata.gz: 9e882a5072cc36a986e8fc2f23f0563755bae2d0c4e6fed4adc51a6fd46b449ea6be3dd189662ea0aa4f427c5402969bfb0ad626c837e9bad68d06aa0a3cc6d3
7
+ data.tar.gz: 63856c35cbcceda6abeb3dc076574d7e880343e8ee7af5e80971c08637a647a079433b1220161c24871d3718c268d018ebdce009ca46d89c4da7c059fdaeaf72
data/README.md CHANGED
@@ -1,5 +1,10 @@
1
1
  # Faraday
2
2
 
3
+ [![Gem Version](https://badge.fury.io/rb/faraday.svg)](https://rubygems.org/gems/faraday)
4
+ [![Build Status](https://travis-ci.org/lostisland/faraday.svg)](https://travis-ci.org/lostisland/faraday)
5
+ [![Gitter](https://badges.gitter.im/lostisland/faraday.svg)](https://gitter.im/lostisland/faraday?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
6
+
7
+
3
8
  Faraday is an HTTP client lib that provides a common interface over many
4
9
  adapters (such as Net::HTTP) and embraces the concept of Rack middleware when
5
10
  processing the request/response cycle.
@@ -9,7 +14,6 @@ Faraday supports these adapters:
9
14
  * [Net::HTTP][net_http] _(default)_
10
15
  * [Net::HTTP::Persistent][persistent]
11
16
  * [Excon][]
12
- * [Typhoeus][]
13
17
  * [Patron][]
14
18
  * [EventMachine][]
15
19
  * [HTTPClient][]
@@ -23,6 +27,23 @@ Available at [rubydoc.info](http://www.rubydoc.info/gems/faraday).
23
27
 
24
28
  ## Usage
25
29
 
30
+ ### Basic Use
31
+
32
+ ```ruby
33
+ response = Faraday.get 'http://sushi.com/nigiri/sake.json'
34
+ ```
35
+ A simple `get` request can be performed by using the syntax described above. This works if you don't need to set up anything; you can roll with just the default middleware
36
+ stack and default adapter (see [Faraday::RackBuilder#initialize](https://github.com/lostisland/faraday/blob/master/lib/faraday/rack_builder.rb)).
37
+
38
+ A more flexible way to use Faraday is to start with a Connection object. If you want to keep the same defaults, you can use this syntax:
39
+
40
+ ```ruby
41
+ conn = Faraday.new(:url => 'http://www.example.com')
42
+ response = conn.get '/users' # GET http://www.example.com/users'
43
+ ```
44
+
45
+ Connections can also take an options hash as a parameter or be configured by using a block. Checkout the section called [Advanced middleware usage](#advanced-middleware-usage) for more details about how to use this block for configurations.
46
+
26
47
  ```ruby
27
48
  conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
28
49
  faraday.request :url_encoded # form-encode POST params
@@ -30,6 +51,19 @@ conn = Faraday.new(:url => 'http://sushi.com') do |faraday|
30
51
  faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
31
52
  end
32
53
 
54
+ # Filter sensitive information from logs with a regex matcher
55
+
56
+ conn = Faraday.new(:url => 'http://sushi.com/api_key=s3cr3t') do |faraday|
57
+ faraday.response :logger do | logger |
58
+ logger.filter(/(api_key=)(\w+)/,'\1[REMOVED]')
59
+ end
60
+ faraday.adapter Faraday.default_adapter # make requests with Net::HTTP
61
+ end
62
+ ```
63
+
64
+ Once you have the connection object, use it to make HTTP requests. You can pass paramters to it in a few different ways:
65
+
66
+ ```ruby
33
67
  ## GET ##
34
68
 
35
69
  response = conn.get '/nigiri/sake.json' # GET http://sushi.com/nigiri/sake.json
@@ -37,7 +71,7 @@ response.body
37
71
 
38
72
  conn.get '/nigiri', { :name => 'Maguro' } # GET http://sushi.com/nigiri?name=Maguro
39
73
 
40
- conn.get do |req| # GET http://sushi.com/search?page=2&limit=100
74
+ conn.get do |req| # GET http://sushi.com/search?page=2&limit=100
41
75
  req.url '/search', :page => 2
42
76
  req.params['limit'] = 100
43
77
  end
@@ -45,7 +79,11 @@ end
45
79
  ## POST ##
46
80
 
47
81
  conn.post '/nigiri', { :name => 'Maguro' } # POST "name=maguro" to http://sushi.com/nigiri
82
+ ```
83
+
84
+ Some configuration options can be adjusted per request:
48
85
 
86
+ ```ruby
49
87
  # post payload as JSON instead of "www-form-urlencoded" encoding:
50
88
  conn.post do |req|
51
89
  req.url '/nigiri'
@@ -62,11 +100,18 @@ conn.get do |req|
62
100
  end
63
101
  ```
64
102
 
65
- If you don't need to set up anything, you can roll with just the default middleware
66
- stack and default adapter (see [Faraday::RackBuilder#initialize](https://github.com/lostisland/faraday/blob/master/lib/faraday/rack_builder.rb)):
103
+ And you can inject arbitrary data into the request using the `context` option:
67
104
 
68
105
  ```ruby
69
- response = Faraday.get 'http://sushi.com/nigiri/sake.json'
106
+ # Anything you inject using context option will be available in the env on all middlewares
107
+
108
+ conn.get do |req|
109
+ req.url '/search'
110
+ req.options.context = {
111
+ foo: 'foo',
112
+ bar: 'bar'
113
+ }
114
+ end
70
115
  ```
71
116
 
72
117
  ### Changing how parameters are serialized
@@ -169,6 +214,53 @@ later, response. Some keys are:
169
214
  :response_headers
170
215
  ```
171
216
 
217
+ ## Ad-hoc adapters customization
218
+
219
+ Faraday is intended to be a generic interface between your code and the adapter. However, sometimes you need to access a feature specific to one of the adapters that is not covered in Faraday's interface.
220
+
221
+ When that happens, you can pass a block when specifying the adapter to customize it. The block parameter will change based on the adapter you're using. See below for some examples.
222
+
223
+ ### NetHttp
224
+ ```ruby
225
+ conn = Faraday.new(...) do |f|
226
+ f.adapter :net_http do |http| # yields Net::HTTP
227
+ http.idle_timeout = 100
228
+ http.verify_callback = lambda do | preverify_ok, cert_store |
229
+ # do something here...
230
+ end
231
+ end
232
+ end
233
+ ```
234
+
235
+ ### NetHttpPersistent
236
+ ```ruby
237
+ conn = Faraday.new(...) do |f|
238
+ f.adapter :net_http_persistent do |http| # yields Net::HTTP::Persistent
239
+ http.idle_timeout = 100
240
+ http.retry_change_requests = true
241
+ end
242
+ end
243
+ ```
244
+
245
+ ### Patron
246
+ ```ruby
247
+ conn = Faraday.new(...) do |f|
248
+ f.adapter :patron do |session| # yields Patron::Session
249
+ session.max_redirects = 10
250
+ end
251
+ end
252
+ ```
253
+
254
+ ### HTTPClient
255
+ ```ruby
256
+ conn = Faraday.new(...) do |f|
257
+ f.adapter :httpclient do |client| # yields HTTPClient
258
+ client.keep_alive_timeout = 20
259
+ client.ssl_config.timeout = 25
260
+ end
261
+ end
262
+ ```
263
+
172
264
  ## Using Faraday for testing
173
265
 
174
266
  ```ruby
@@ -240,7 +332,6 @@ See [LICENSE][] for details.
240
332
  [persistent]: https://github.com/drbrain/net-http-persistent
241
333
  [travis]: https://travis-ci.org/lostisland/faraday
242
334
  [excon]: https://github.com/excon/excon#readme
243
- [typhoeus]: https://github.com/typhoeus/typhoeus#readme
244
335
  [patron]: http://toland.github.io/patron/
245
336
  [eventmachine]: https://github.com/igrigorik/em-http-request#readme
246
337
  [httpclient]: https://github.com/nahi/httpclient
@@ -138,7 +138,7 @@ module Faraday
138
138
 
139
139
  # TODO: reuse the connection to support pipelining
140
140
  def perform_single_request(env)
141
- req = EventMachine::HttpRequest.new(env[:url], connection_config(env))
141
+ req = create_request(env)
142
142
  req.setup_request(env[:method], request_config(env)).callback { |client|
143
143
  status = client.response_header.status
144
144
  reason = client.response_header.http_reason
@@ -150,6 +150,10 @@ module Faraday
150
150
  }
151
151
  end
152
152
 
153
+ def create_request(env)
154
+ EventMachine::HttpRequest.new(env[:url], connection_config(env).merge(@connection_options))
155
+ end
156
+
153
157
  def error_message(client)
154
158
  client.error or "request failed"
155
159
  end
@@ -19,7 +19,7 @@ module Faraday
19
19
 
20
20
  def call(env)
21
21
  super
22
- request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env))
22
+ request = create_request(env)
23
23
 
24
24
  http_method = env[:method].to_s.downcase.to_sym
25
25
 
@@ -87,6 +87,10 @@ module Faraday
87
87
  raise
88
88
  end
89
89
  end
90
+
91
+ def create_request(env)
92
+ EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env).merge(@connection_options))
93
+ end
90
94
  end
91
95
  end
92
96
  end
@@ -3,11 +3,6 @@ module Faraday
3
3
  class Excon < Faraday::Adapter
4
4
  dependency 'excon'
5
5
 
6
- def initialize(app, connection_options = {})
7
- @connection_options = connection_options
8
- super(app)
9
- end
10
-
11
6
  def call(env)
12
7
  super
13
8
 
@@ -50,7 +45,7 @@ module Faraday
50
45
  end
51
46
  end
52
47
 
53
- conn = ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
48
+ conn = create_connection(env, opts)
54
49
 
55
50
  resp = conn.request \
56
51
  :method => env[:method].to_s.upcase,
@@ -72,6 +67,10 @@ module Faraday
72
67
  raise Error::TimeoutError, err
73
68
  end
74
69
 
70
+ def create_connection(env, opts)
71
+ ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
72
+ end
73
+
75
74
  # TODO: support streaming requests
76
75
  def read_body(env)
77
76
  env[:body].respond_to?(:read) ? env[:body].read : env[:body]
@@ -29,6 +29,8 @@ module Faraday
29
29
  configure_ssl ssl
30
30
  end
31
31
 
32
+ configure_client
33
+
32
34
  # TODO Don't stream yet.
33
35
  # https://github.com/nahi/httpclient/pull/90
34
36
  env[:body] = env[:body].read if env[:body].respond_to? :read
@@ -48,7 +50,7 @@ module Faraday
48
50
  else
49
51
  raise Faraday::Error::ClientError, $!
50
52
  end
51
- rescue Errno::ECONNREFUSED, EOFError
53
+ rescue Errno::ECONNREFUSED, IOError
52
54
  raise Faraday::Error::ConnectionFailed, $!
53
55
  rescue => err
54
56
  if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
@@ -95,12 +97,21 @@ module Faraday
95
97
  end
96
98
  end
97
99
 
100
+ def configure_client
101
+ @config_block.call(client) if @config_block
102
+ end
103
+
98
104
  def ssl_cert_store(ssl)
99
105
  return ssl[:cert_store] if ssl[:cert_store]
100
- # Use the default cert store by default, i.e. system ca certs
101
- cert_store = OpenSSL::X509::Store.new
102
- cert_store.set_default_paths
103
- cert_store
106
+ # Memoize the cert store so that the same one is passed to
107
+ # HTTPClient each time, to avoid resyncing SSL sesions when
108
+ # it's changed
109
+ @cert_store ||= begin
110
+ # Use the default cert store by default, i.e. system ca certs
111
+ cert_store = OpenSSL::X509::Store.new
112
+ cert_store.set_default_paths
113
+ cert_store
114
+ end
104
115
  end
105
116
 
106
117
  def ssl_verify_mode(ssl)
@@ -10,7 +10,7 @@ module Faraday
10
10
  class Adapter
11
11
  class NetHttp < Faraday::Adapter
12
12
  NET_HTTP_EXCEPTIONS = [
13
- EOFError,
13
+ IOError,
14
14
  Errno::ECONNABORTED,
15
15
  Errno::ECONNREFUSED,
16
16
  Errno::ECONNRESET,
@@ -32,10 +32,7 @@ module Faraday
32
32
  super
33
33
  with_net_http_connection(env) do |http|
34
34
  configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
35
-
36
- req = env[:request]
37
- http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
38
- http.open_timeout = req[:open_timeout] if req[:open_timeout]
35
+ configure_request(http, env[:request])
39
36
 
40
37
  begin
41
38
  http_response = perform_request(http, env)
@@ -109,6 +106,13 @@ module Faraday
109
106
  http.ssl_version = ssl[:version] if ssl[:version]
110
107
  end
111
108
 
109
+ def configure_request(http, req)
110
+ http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
111
+ http.open_timeout = req[:open_timeout] if req[:open_timeout]
112
+
113
+ @config_block.call(http) if @config_block
114
+ end
115
+
112
116
  def ssl_cert_store(ssl)
113
117
  return ssl[:cert_store] if ssl[:cert_store]
114
118
  # Use the default cert store by default, i.e. system ca certs
@@ -7,8 +7,8 @@ module Faraday
7
7
  class NetHttpPersistent < NetHttp
8
8
  dependency 'net/http/persistent'
9
9
 
10
- def with_net_http_connection(env)
11
- if proxy = env[:request][:proxy]
10
+ def net_http_connection(env)
11
+ if (proxy = env[:request][:proxy])
12
12
  proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s)
13
13
  proxy_uri.user = proxy_uri.password = nil
14
14
  # awful patch for net-http-persistent 2.8 not unescaping user/password
@@ -16,9 +16,10 @@ module Faraday
16
16
  define_method(:user) { proxy[:user] }
17
17
  define_method(:password) { proxy[:password] }
18
18
  end if proxy[:user]
19
+ return Net::HTTP::Persistent.new 'Faraday', proxy_uri
19
20
  end
20
21
 
21
- yield Net::HTTP::Persistent.new 'Faraday', proxy_uri
22
+ Net::HTTP::Persistent.new 'Faraday'
22
23
  end
23
24
 
24
25
  def perform_request(http, env)
@@ -3,11 +3,6 @@ module Faraday
3
3
  class Patron < Faraday::Adapter
4
4
  dependency 'patron'
5
5
 
6
- def initialize(app, &block)
7
- super(app)
8
- @block = block
9
- end
10
-
11
6
  def call(env)
12
7
  super
13
8
 
@@ -73,7 +68,7 @@ module Faraday
73
68
  def create_session
74
69
  session = ::Patron::Session.new
75
70
  session.insecure = true
76
- @block.call(session) if @block
71
+ @config_block.call(session) if @config_block
77
72
  session
78
73
  end
79
74
  end
@@ -30,6 +30,12 @@ module Faraday
30
30
  extend Parallelism
31
31
  self.supports_parallel = false
32
32
 
33
+ def initialize(app = nil, opts = {}, &block)
34
+ super(app)
35
+ @connection_options = opts
36
+ @config_block = block
37
+ end
38
+
33
39
  def call(env)
34
40
  env.clear_body if env.needs_body?
35
41
  end
@@ -55,11 +55,11 @@ module Faraday
55
55
  # :user - String (optional)
56
56
  # :password - String (optional)
57
57
  def initialize(url = nil, options = nil)
58
+ options = ConnectionOptions.from(options)
59
+
58
60
  if url.is_a?(Hash)
59
- options = options ? options.merge(url) : ConnectionOptions.from(url)
61
+ options = options.merge(url)
60
62
  url = options.url
61
- else
62
- options = ConnectionOptions.from(options)
63
63
  end
64
64
 
65
65
  @parallel_manager = nil
@@ -81,11 +81,20 @@ module Faraday
81
81
 
82
82
  @proxy = nil
83
83
  proxy(options.fetch(:proxy) {
84
- uri = ENV['http_proxy']
85
- if uri && !uri.empty?
86
- uri = 'http://' + uri if uri !~ /^http/i
87
- uri
84
+ uri = nil
85
+ if URI.parse("").respond_to?(:find_proxy)
86
+ case url
87
+ when String
88
+ uri = URI.parse(url).find_proxy
89
+ when URI
90
+ uri = url.find_proxy
91
+ when nil
92
+ uri = find_default_proxy
93
+ end
94
+ else
95
+ uri = find_default_proxy
88
96
  end
97
+ uri
89
98
  })
90
99
 
91
100
  yield(self) if block_given?
@@ -433,5 +442,14 @@ module Faraday
433
442
  header(*args)
434
443
  headers[Faraday::Request::Authorization::KEY] = header
435
444
  end
445
+
446
+ def find_default_proxy
447
+ warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY']
448
+ uri = ENV['http_proxy']
449
+ if uri && !uri.empty?
450
+ uri = 'http://' + uri if uri !~ /^http/i
451
+ uri
452
+ end
453
+ end
436
454
  end
437
455
  end
@@ -18,23 +18,20 @@ module Faraday
18
18
  # Public
19
19
  def update(obj)
20
20
  obj.each do |key, value|
21
- if sub_options = self.class.options_for(key)
22
- value = sub_options.from(value) if value
23
- elsif Hash === value
24
- hash = {}
25
- value.each do |hash_key, hash_value|
26
- hash[hash_key] = hash_value
27
- end
28
- value = hash
21
+ sub_options = self.class.options_for(key)
22
+ if sub_options
23
+ new_value = sub_options.from(value) if value
24
+ elsif value.is_a?(Hash)
25
+ new_value = value.dup
26
+ else
27
+ new_value = value
29
28
  end
30
29
 
31
- self.send("#{key}=", value) unless value.nil?
30
+ self.send("#{key}=", new_value) unless new_value.nil?
32
31
  end
33
32
  self
34
33
  end
35
34
 
36
- alias merge! update
37
-
38
35
  # Public
39
36
  def delete(key)
40
37
  value = send(key)
@@ -48,8 +45,24 @@ module Faraday
48
45
  end
49
46
 
50
47
  # Public
51
- def merge(value)
52
- dup.update(value)
48
+ def merge!(other)
49
+ other.each do |key, other_value|
50
+ self_value = self.send(key)
51
+ sub_options = self.class.options_for(key)
52
+ new_value = sub_options ? self_value.merge(other_value) : other_value
53
+ self.send("#{key}=", new_value) unless new_value.nil?
54
+ end
55
+ self
56
+ end
57
+
58
+ # Public
59
+ def merge(other)
60
+ dup.merge!(other)
61
+ end
62
+
63
+ # Public
64
+ def deep_dup
65
+ self.class.from(self)
53
66
  end
54
67
 
55
68
  # Public
@@ -189,8 +202,7 @@ module Faraday
189
202
  end
190
203
 
191
204
  class RequestOptions < Options.new(:params_encoder, :proxy, :bind,
192
- :timeout, :open_timeout, :boundary,
193
- :oauth)
205
+ :timeout, :open_timeout, :boundary, :oauth, :context)
194
206
 
195
207
  def []=(key, value)
196
208
  if key && key.to_sym == :proxy
@@ -16,8 +16,7 @@ module Faraday
16
16
 
17
17
  # Internal
18
18
  def self.build_hash(type, hash)
19
- offset = KEY.size + type.size + 3
20
- comma = ",\n#{' ' * offset}"
19
+ comma = ", "
21
20
  values = []
22
21
  hash.each do |key, value|
23
22
  values << "#{key}=#{value.to_s.inspect}"
@@ -1,13 +1,14 @@
1
1
  require File.expand_path("../url_encoded", __FILE__)
2
+ require 'securerandom'
2
3
 
3
4
  module Faraday
4
5
  class Request::Multipart < Request::UrlEncoded
5
6
  self.mime_type = 'multipart/form-data'.freeze
6
- DEFAULT_BOUNDARY = "-----------RubyMultipartPost".freeze unless defined? DEFAULT_BOUNDARY
7
+ DEFAULT_BOUNDARY_PREFIX = "-----------RubyMultipartPost".freeze unless defined? DEFAULT_BOUNDARY_PREFIX
7
8
 
8
9
  def call(env)
9
10
  match_content_type(env) do |params|
10
- env.request.boundary ||= DEFAULT_BOUNDARY
11
+ env.request.boundary ||= unique_boundary
11
12
  env.request_headers[CONTENT_TYPE] += "; boundary=#{env.request.boundary}"
12
13
  env.body = create_multipart(env, params)
13
14
  end
@@ -44,6 +45,10 @@ module Faraday
44
45
  return body
45
46
  end
46
47
 
48
+ def unique_boundary
49
+ "#{DEFAULT_BOUNDARY_PREFIX}-#{SecureRandom.hex}"
50
+ end
51
+
47
52
  def process_params(params, prefix = nil, pieces = nil, &block)
48
53
  params.inject(pieces || []) do |all, (key, value)|
49
54
  key = "#{prefix}[#{key}]" if prefix
@@ -10,7 +10,7 @@ module Faraday
10
10
  #
11
11
  # Faraday.new do |conn|
12
12
  # conn.request :retry, max: 2, interval: 0.05,
13
- # interval_randomness: 0.5, backoff_factor: 2
13
+ # interval_randomness: 0.5, backoff_factor: 2,
14
14
  # exceptions: [CustomException, 'Timeout::Error']
15
15
  # conn.adapter ...
16
16
  # end
@@ -27,7 +27,7 @@ module Faraday
27
27
  DEFAULT_CHECK = lambda { |env,exception| false }
28
28
 
29
29
  def self.from(value)
30
- if Fixnum === value
30
+ if Integer === value
31
31
  new(value)
32
32
  else
33
33
  super(value)
@@ -117,6 +117,7 @@ module Faraday
117
117
  rescue @errmatch => exception
118
118
  if retries > 0 && retry_request?(env, exception)
119
119
  retries -= 1
120
+ rewind_files(request_body)
120
121
  sleep sleep_amount(retries + 1)
121
122
  retry
122
123
  end
@@ -150,5 +151,13 @@ module Faraday
150
151
  @options.methods.include?(env[:method]) || @options.retry_if.call(env, exception)
151
152
  end
152
153
 
154
+ def rewind_files(env)
155
+ env && env.each do |_, value|
156
+ if value.is_a? UploadIO
157
+ value.rewind
158
+ end
159
+ end
160
+ end
161
+
153
162
  end
154
163
  end
@@ -12,22 +12,28 @@ module Faraday
12
12
  require 'logger'
13
13
  ::Logger.new(STDOUT)
14
14
  end
15
+ @filter = []
15
16
  @options = DEFAULT_OPTIONS.merge(options)
17
+ yield self if block_given?
16
18
  end
17
19
 
18
20
  def_delegators :@logger, :debug, :info, :warn, :error, :fatal
19
21
 
20
22
  def call(env)
21
- info "#{env.method} #{env.url.to_s}"
22
- debug('request') { dump_headers env.request_headers } if log_headers?(:request)
23
- debug('request') { dump_body(env[:body]) } if env[:body] && log_body?(:request)
23
+ info "#{env.method} #{apply_filters(env.url.to_s)}"
24
+ debug('request') { apply_filters( dump_headers env.request_headers ) } if log_headers?(:request)
25
+ debug('request') { apply_filters( dump_body(env[:body]) ) } if env[:body] && log_body?(:request)
24
26
  super
25
27
  end
26
28
 
27
29
  def on_complete(env)
28
30
  info('Status') { env.status.to_s }
29
- debug('response') { dump_headers env.response_headers } if log_headers?(:response)
30
- debug('response') { dump_body env[:body] } if env[:body] && log_body?(:response)
31
+ debug('response') { apply_filters( dump_headers env.response_headers ) } if log_headers?(:response)
32
+ debug('response') { apply_filters( dump_body env[:body] ) } if env[:body] && log_body?(:response)
33
+ end
34
+
35
+ def filter(filter_word, filter_replacement)
36
+ @filter.push([ filter_word, filter_replacement ])
31
37
  end
32
38
 
33
39
  private
@@ -62,5 +68,13 @@ module Faraday
62
68
  else @options[:bodies]
63
69
  end
64
70
  end
71
+
72
+ def apply_filters(output)
73
+ @filter.each do |pattern, replacement|
74
+ output = output.to_s.gsub(pattern, replacement)
75
+ end
76
+ output
77
+ end
78
+
65
79
  end
66
80
  end
data/lib/faraday/utils.rb CHANGED
@@ -108,6 +108,14 @@ module Faraday
108
108
  }
109
109
  end
110
110
 
111
+ def init_with(coder)
112
+ @names = coder['names']
113
+ end
114
+
115
+ def encode_with(coder)
116
+ coder['names'] = @names
117
+ end
118
+
111
119
  protected
112
120
 
113
121
  def names
data/lib/faraday.rb CHANGED
@@ -14,7 +14,7 @@ require 'forwardable'
14
14
  # conn.get '/'
15
15
  #
16
16
  module Faraday
17
- VERSION = "0.10.0"
17
+ VERSION = "0.12.0"
18
18
 
19
19
  class << self
20
20
  # Public: Gets or sets the root path that Faraday is being loaded from.
@@ -34,9 +34,6 @@ module Faraday
34
34
  # Faraday.get "https://faraday.com"
35
35
  attr_writer :default_connection
36
36
 
37
- # Public: Sets the default options used when calling Faraday#new.
38
- attr_writer :default_connection_options
39
-
40
37
  # Public: Initializes a new Faraday::Connection.
41
38
  #
42
39
  # url - The optional String base URL to use as a prefix for all
@@ -66,7 +63,7 @@ module Faraday
66
63
  # Returns a Faraday::Connection.
67
64
  def new(url = nil, options = nil)
68
65
  block = block_given? ? Proc.new : nil
69
- options = options ? default_connection_options.merge(options) : default_connection_options.dup
66
+ options = options ? default_connection_options.merge(options) : default_connection_options
70
67
  Faraday::Connection.new(url, options, &block)
71
68
  end
72
69
 
@@ -122,6 +119,11 @@ module Faraday
122
119
  @default_connection_options ||= ConnectionOptions.new
123
120
  end
124
121
 
122
+ # Public: Sets the default options used when calling Faraday#new.
123
+ def self.default_connection_options=(options)
124
+ @default_connection_options = ConnectionOptions.from(options)
125
+ end
126
+
125
127
  unless const_defined? :Timer
126
128
  require 'timeout'
127
129
  Timer = Timeout
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rick Olson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-11 00:00:00.000000000 Z
11
+ date: 2017-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: multipart-post