faraday-conductivity 0.2.1 → 0.3.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 +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +4 -0
- data/Appraisals +7 -0
- data/README.md +40 -3
- data/Rakefile +1 -0
- data/faraday-conductivity.gemspec +1 -0
- data/gemfiles/faraday_0.8.gemfile +7 -0
- data/gemfiles/faraday_0.9.gemfile +7 -0
- data/lib/faraday/conductivity.rb +9 -6
- data/lib/faraday/conductivity/mimetype.rb +1 -0
- data/lib/faraday/conductivity/request_headers.rb +19 -0
- data/lib/faraday/conductivity/selective_errors.rb +87 -27
- data/lib/faraday/conductivity/version.rb +1 -1
- data/spec/middleware/request_headers_spec.rb +28 -0
- data/spec/middleware/selective_errors_spec.rb +23 -2
- metadata +38 -18
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 81337bd02893a9e0365427e2f498fc299c9bfd91
|
4
|
+
data.tar.gz: b35b5bf0cf8e97c222b7a08d2425f6ffc47210d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ff06c7a6e23d062a62cf24bc02867c9ec23243afcf284dec10bdf4737d97bb2cbfa23befd52907d4b2e590b41205a24398e78572513da26491f8c47d6027e9ed
|
7
|
+
data.tar.gz: 88b20bf120f272d9c2e16908bd2bcbc650befac32e64ba6570d3cc103ac3244af517d2c7cd90d33883c6a697f24a174c5da87bd2ebd437b577de2f55e3510069
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
data/Appraisals
ADDED
data/README.md
CHANGED
@@ -9,7 +9,7 @@ These middlewares are currently included:
|
|
9
9
|
* **extended_logging**, logs *all* the information of the request.
|
10
10
|
* **request_id**, passes along the `X-Request-Id` header to track API request
|
11
11
|
back to the source.
|
12
|
-
* **
|
12
|
+
* **request_headers**, allows you to specify default request headers used in each request.
|
13
13
|
* **selective_errors**, raise errors only on the statuses that you specify.
|
14
14
|
|
15
15
|
Further information:
|
@@ -38,7 +38,7 @@ connection = Faraday.new(url: "http://widgets.yourapp.com") do |faraday|
|
|
38
38
|
# provided by this gem
|
39
39
|
faraday.request :user_agent, app: "MarketingSite", version: APP_VERSION
|
40
40
|
faraday.request :request_id
|
41
|
-
faraday.request :
|
41
|
+
faraday.request :request_headers, accept: "application/vnd.widgets-v2+json"
|
42
42
|
|
43
43
|
# provided by this gem
|
44
44
|
faraday.use :extended_logging, logger: Rails.logger
|
@@ -192,7 +192,44 @@ end
|
|
192
192
|
The errors raised will be the same as Faraday, namely
|
193
193
|
`Faraday::Error::ResourceNotFound` for 404 errors,
|
194
194
|
`Faraday::Error::ConnectionFailed` for 407 and `Faraday::Error::ClientError` for
|
195
|
-
the rest.
|
195
|
+
the rest.
|
196
|
+
|
197
|
+
If you don't specify the `:on` or `:except` options, it will behave exactly like
|
198
|
+
`:raise_error`. The errors are however "enhanced" with extra information about
|
199
|
+
the request that normally are lost:
|
200
|
+
|
201
|
+
``` ruby
|
202
|
+
begin
|
203
|
+
do_failing_request_here
|
204
|
+
rescue Faraday::Error::ClientError => error
|
205
|
+
puts error.request[:url]
|
206
|
+
puts error.request[:method]
|
207
|
+
puts error.request[:body]
|
208
|
+
puts error.request[:headers]
|
209
|
+
|
210
|
+
puts error.response[:status]
|
211
|
+
puts error.response[:body]
|
212
|
+
puts error.response[:headers]
|
213
|
+
puts error.response_time
|
214
|
+
end
|
215
|
+
```
|
216
|
+
|
217
|
+
### Request Headers
|
218
|
+
|
219
|
+
Allows you to set request headers ahead of time, so you don't have to do this
|
220
|
+
each time you make a request. You can override it per request of course.
|
221
|
+
|
222
|
+
Usage:
|
223
|
+
|
224
|
+
``` ruby
|
225
|
+
connection = Faraday.new(url: "http://widgets.yourapp.com") do |faraday|
|
226
|
+
faraday.request :request_headers, accept: "application/json", x_version_number: "10"
|
227
|
+
end
|
228
|
+
```
|
229
|
+
|
230
|
+
### Mimetype
|
231
|
+
|
232
|
+
This one is deprecated. Use Request Headers instead.
|
196
233
|
|
197
234
|
## Contributing
|
198
235
|
|
data/Rakefile
CHANGED
data/lib/faraday/conductivity.rb
CHANGED
@@ -9,15 +9,18 @@ require "faraday/conductivity/request_id_filter"
|
|
9
9
|
require "faraday/conductivity/user_agent"
|
10
10
|
require "faraday/conductivity/repeater"
|
11
11
|
require "faraday/conductivity/selective_errors"
|
12
|
+
require "faraday/conductivity/request_headers"
|
12
13
|
|
13
14
|
module Faraday
|
14
15
|
module Conductivity
|
15
16
|
end
|
16
|
-
|
17
|
-
register_middleware :
|
18
|
-
register_middleware :
|
19
|
-
register_middleware
|
20
|
-
register_middleware
|
21
|
-
register_middleware
|
17
|
+
|
18
|
+
Faraday::Middleware.register_middleware :extended_logging => Faraday::Conductivity::ExtendedLogging
|
19
|
+
Faraday::Middleware.register_middleware :repeater => Faraday::Conductivity::Repeater
|
20
|
+
Faraday::Request.register_middleware :mimetype => Faraday::Conductivity::Mimetype
|
21
|
+
Faraday::Request.register_middleware :request_id => Faraday::Conductivity::RequestId
|
22
|
+
Faraday::Request.register_middleware :request_headers => Faraday::Conductivity::RequestHeaders
|
23
|
+
Faraday::Request.register_middleware :user_agent => Faraday::Conductivity::UserAgent
|
24
|
+
Faraday::Response.register_middleware :selective_errors => Faraday::Conductivity::SelectiveErrors
|
22
25
|
end
|
23
26
|
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Faraday
|
2
|
+
module Conductivity
|
3
|
+
class RequestHeaders < Faraday::Middleware
|
4
|
+
|
5
|
+
def initialize(app, headers)
|
6
|
+
super(app)
|
7
|
+
@headers = headers
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
@headers.each do |header, value|
|
12
|
+
env[:request_headers][header] ||= value
|
13
|
+
end
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -1,5 +1,57 @@
|
|
1
1
|
module Faraday
|
2
2
|
module Conductivity
|
3
|
+
|
4
|
+
module Error
|
5
|
+
|
6
|
+
attr_accessor :request, :response, :response_time
|
7
|
+
|
8
|
+
def initialize(*)
|
9
|
+
@request = {}
|
10
|
+
@response = {}
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
def message
|
15
|
+
if @wrapped_exception
|
16
|
+
"#{@wrapped_exception.class}: #{super}"
|
17
|
+
else
|
18
|
+
"#{request[:method].to_s.upcase} #{request[:url]} responded with status #{response[:status]}"
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def inspect
|
23
|
+
"<#{self.class}> #{message}"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
# Use this to raise errors on certain HTTP statuses. These are basically
|
29
|
+
# the same errors as Faraday raises when you use the "raise_error"
|
30
|
+
# middleware, but with added fields to better inspect what went wrong.
|
31
|
+
#
|
32
|
+
# Examples:
|
33
|
+
#
|
34
|
+
# # specify an array
|
35
|
+
# faraday.response :selective_errors, on: [422,500]
|
36
|
+
# # or a range:
|
37
|
+
# faraday.response :selective_errors, on: 500...600
|
38
|
+
# # specify errors:
|
39
|
+
# faraday.response :selective_errors, except: [404,422]
|
40
|
+
#
|
41
|
+
# Rescueing the errors:
|
42
|
+
#
|
43
|
+
# begin
|
44
|
+
# do_request
|
45
|
+
# rescue Faraday::Conductivity::Error => error
|
46
|
+
# puts error.request[:url]
|
47
|
+
# puts error.request[:method]
|
48
|
+
# puts error.request[:body]
|
49
|
+
# puts error.request[:headers]
|
50
|
+
#
|
51
|
+
# puts error.response[:status]
|
52
|
+
# puts error.response[:body]
|
53
|
+
# puts error.response[:headers]
|
54
|
+
# end
|
3
55
|
class SelectiveErrors < Faraday::Middleware
|
4
56
|
|
5
57
|
ClientErrorStatuses = 400...600
|
@@ -11,12 +63,43 @@ module Faraday
|
|
11
63
|
end
|
12
64
|
|
13
65
|
def call(env)
|
14
|
-
# capture
|
15
|
-
|
66
|
+
# capture request because it will be modified during the request
|
67
|
+
request = {
|
68
|
+
:method => env[:method],
|
69
|
+
:url => env[:url],
|
70
|
+
:body => env[:body],
|
71
|
+
:headers => env[:request_headers],
|
72
|
+
}
|
73
|
+
|
74
|
+
start_time = Time.now
|
75
|
+
|
16
76
|
@app.call(env).on_complete do
|
17
|
-
|
18
|
-
|
77
|
+
|
78
|
+
status = env[:status]
|
79
|
+
|
80
|
+
if should_raise_error?(status)
|
81
|
+
response = {
|
82
|
+
:status => env[:status],
|
83
|
+
:body => env[:body],
|
84
|
+
:headers => env[:response_headers],
|
85
|
+
}
|
86
|
+
error = case status
|
87
|
+
when 404
|
88
|
+
Faraday::Error::ResourceNotFound.new(response)
|
89
|
+
when 407
|
90
|
+
# mimic the behavior that we get with proxy requests with HTTPS
|
91
|
+
Faraday::Error::ConnectionFailed.new(%{407 "Proxy Authentication Required "})
|
92
|
+
else
|
93
|
+
Faraday::Error::ClientError.new(response)
|
94
|
+
end
|
95
|
+
error.extend Error
|
96
|
+
error.response = response
|
97
|
+
error.request = request
|
98
|
+
error.response_time = Time.now - start_time
|
99
|
+
raise error
|
100
|
+
|
19
101
|
end
|
102
|
+
|
20
103
|
end
|
21
104
|
end
|
22
105
|
|
@@ -24,29 +107,6 @@ module Faraday
|
|
24
107
|
@on.include?(status) && !@except.include?(status)
|
25
108
|
end
|
26
109
|
|
27
|
-
def raise_error(env, request_body)
|
28
|
-
case env[:status]
|
29
|
-
when 404
|
30
|
-
raise Faraday::Error::ResourceNotFound, response_values(env, request_body)
|
31
|
-
when 407
|
32
|
-
# mimic the behavior that we get with proxy requests with HTTPS
|
33
|
-
raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
|
34
|
-
else
|
35
|
-
raise Faraday::Error::ClientError, response_values(env, request_body)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def response_values(env, request_body)
|
40
|
-
{
|
41
|
-
:url => env[:url],
|
42
|
-
:status => env[:status],
|
43
|
-
:request_body => request_body,
|
44
|
-
:request_headers => env[:request_headers],
|
45
|
-
:response_headers => env[:response_headers],
|
46
|
-
:response_body => env[:body],
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
110
|
end
|
51
111
|
end
|
52
112
|
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Faraday::Conductivity::RequestHeaders do
|
4
|
+
|
5
|
+
it "includes the mimetype specified" do
|
6
|
+
connection = create_connection do |faraday|
|
7
|
+
faraday.request :request_headers, :accept => "application/json", :x_version_number => "123"
|
8
|
+
end
|
9
|
+
request_headers = connection.get("/test").env[:request_headers]
|
10
|
+
|
11
|
+
request_headers["Accept"].should eq "application/json"
|
12
|
+
request_headers["X-Version-Number"].should eq "123"
|
13
|
+
end
|
14
|
+
|
15
|
+
it "doesn't override locally specified headers" do
|
16
|
+
connection = create_connection do |faraday|
|
17
|
+
faraday.request :request_headers, :accept => "application/json"
|
18
|
+
end
|
19
|
+
response = connection.get("/test") do |request|
|
20
|
+
request.headers[:accept] = "application/xml"
|
21
|
+
end
|
22
|
+
|
23
|
+
request_headers = response.env[:request_headers]
|
24
|
+
|
25
|
+
request_headers["Accept"].should eq "application/xml"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -34,18 +34,39 @@ describe Faraday::Conductivity::SelectiveErrors do
|
|
34
34
|
expect { response_with_status(407) }.to raise_error Faraday::Error::ConnectionFailed
|
35
35
|
end
|
36
36
|
|
37
|
+
it "stores more information about the request and response" do
|
38
|
+
apply_selective_errors on: 403..422, except: [408]
|
39
|
+
error = response_with_status(422) rescue $!
|
40
|
+
expect(error.message).to eq "GET http://widgets.example.org/test responded with status 422"
|
41
|
+
|
42
|
+
expect(error.request[:url].to_s).to eq "http://widgets.example.org/test"
|
43
|
+
expect(error.request[:method]).to eq :get
|
44
|
+
|
45
|
+
expect(error.response[:status]).to eq 422
|
46
|
+
|
47
|
+
expect(error.request[:body]).to eq "the request body"
|
48
|
+
expect(error.response[:body]).to eq "the response body"
|
49
|
+
|
50
|
+
expect(error.request[:headers]).to eq "Accept" => "application/json"
|
51
|
+
expect(error.response[:headers]).to eq "X-Foo-Bar" => "y"
|
52
|
+
expect(error.response_time).to be_a Float
|
53
|
+
end
|
54
|
+
|
37
55
|
def apply_selective_errors(options)
|
38
56
|
@options = options
|
39
57
|
end
|
40
58
|
|
41
59
|
def response_with_status(status)
|
42
60
|
stubs = create_stubs do |stub|
|
43
|
-
stub.get("/test") { |e| [status, {}, "response"] }
|
61
|
+
stub.get("/test") { |e| [status, { :x_foo_bar => "y" }, "the response body"] }
|
44
62
|
end
|
45
63
|
connection = create_connection(stubs) do |faraday|
|
46
64
|
faraday.response :selective_errors, @options
|
47
65
|
end
|
48
|
-
connection.get("/test")
|
66
|
+
connection.get("/test") do |f|
|
67
|
+
f.body = "the request body"
|
68
|
+
f.headers = { "Accept" => "application/json" }
|
69
|
+
end
|
49
70
|
end
|
50
71
|
|
51
72
|
end
|
metadata
CHANGED
@@ -1,83 +1,97 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: faraday-conductivity
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- iain
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2014-03-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: faraday
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - ~>
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0.8'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - ~>
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0.8'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ">="
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: '0'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pry
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- -
|
59
|
+
- - ">="
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: '0'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- -
|
66
|
+
- - ">="
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: service_double
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - ">="
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: '0'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: appraisal
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
81
95
|
- !ruby/object:Gem::Version
|
82
96
|
version: '0'
|
83
97
|
description: Extra Faraday middleware, geared towards a service oriented architecture.
|
@@ -87,18 +101,22 @@ executables: []
|
|
87
101
|
extensions: []
|
88
102
|
extra_rdoc_files: []
|
89
103
|
files:
|
90
|
-
- .gitignore
|
91
|
-
- .rspec
|
92
|
-
- .travis.yml
|
104
|
+
- ".gitignore"
|
105
|
+
- ".rspec"
|
106
|
+
- ".travis.yml"
|
107
|
+
- Appraisals
|
93
108
|
- Gemfile
|
94
109
|
- LICENSE.txt
|
95
110
|
- README.md
|
96
111
|
- Rakefile
|
97
112
|
- faraday-conductivity.gemspec
|
113
|
+
- gemfiles/faraday_0.8.gemfile
|
114
|
+
- gemfiles/faraday_0.9.gemfile
|
98
115
|
- lib/faraday/conductivity.rb
|
99
116
|
- lib/faraday/conductivity/extended_logging.rb
|
100
117
|
- lib/faraday/conductivity/mimetype.rb
|
101
118
|
- lib/faraday/conductivity/repeater.rb
|
119
|
+
- lib/faraday/conductivity/request_headers.rb
|
102
120
|
- lib/faraday/conductivity/request_id.rb
|
103
121
|
- lib/faraday/conductivity/request_id_filter.rb
|
104
122
|
- lib/faraday/conductivity/selective_errors.rb
|
@@ -108,6 +126,7 @@ files:
|
|
108
126
|
- spec/middleware/extended_logging_spec.rb
|
109
127
|
- spec/middleware/mimetype_spec.rb
|
110
128
|
- spec/middleware/repeater_spec.rb
|
129
|
+
- spec/middleware/request_headers_spec.rb
|
111
130
|
- spec/middleware/request_id_spec.rb
|
112
131
|
- spec/middleware/selective_errors_spec.rb
|
113
132
|
- spec/middleware/user_agent_spec.rb
|
@@ -122,17 +141,17 @@ require_paths:
|
|
122
141
|
- lib
|
123
142
|
required_ruby_version: !ruby/object:Gem::Requirement
|
124
143
|
requirements:
|
125
|
-
- -
|
144
|
+
- - ">="
|
126
145
|
- !ruby/object:Gem::Version
|
127
146
|
version: '0'
|
128
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
129
148
|
requirements:
|
130
|
-
- -
|
149
|
+
- - ">="
|
131
150
|
- !ruby/object:Gem::Version
|
132
151
|
version: '0'
|
133
152
|
requirements: []
|
134
153
|
rubyforge_project:
|
135
|
-
rubygems_version: 2.
|
154
|
+
rubygems_version: 2.2.2
|
136
155
|
signing_key:
|
137
156
|
specification_version: 4
|
138
157
|
summary: Extra Faraday middleware, geared towards a service oriented architecture.
|
@@ -141,6 +160,7 @@ test_files:
|
|
141
160
|
- spec/middleware/extended_logging_spec.rb
|
142
161
|
- spec/middleware/mimetype_spec.rb
|
143
162
|
- spec/middleware/repeater_spec.rb
|
163
|
+
- spec/middleware/request_headers_spec.rb
|
144
164
|
- spec/middleware/request_id_spec.rb
|
145
165
|
- spec/middleware/selective_errors_spec.rb
|
146
166
|
- spec/middleware/user_agent_spec.rb
|