faraday_middleware 0.8.8 → 0.9.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 +1 -1
- data/Rakefile +5 -3
- data/lib/faraday_middleware.rb +5 -1
- data/lib/faraday_middleware/request/method_override.rb +51 -0
- data/lib/faraday_middleware/response/follow_redirects.rb +8 -2
- data/lib/faraday_middleware/version.rb +1 -1
- data/spec/caching_test.rb +1 -1
- data/spec/chunked_spec.rb +15 -15
- data/spec/encode_json_spec.rb +13 -13
- data/spec/follow_redirects_spec.rb +59 -46
- data/spec/helper.rb +3 -0
- data/spec/mashify_spec.rb +30 -30
- data/spec/method_override_spec.rb +92 -0
- data/spec/oauth2_spec.rb +18 -18
- data/spec/oauth_spec.rb +19 -19
- data/spec/parse_dates_spec.rb +14 -17
- data/spec/parse_json_spec.rb +24 -24
- data/spec/parse_marshal_spec.rb +3 -3
- data/spec/parse_xml_spec.rb +13 -13
- data/spec/parse_yaml_spec.rb +10 -10
- data/spec/rashify_spec.rb +22 -22
- metadata +5 -2
data/Gemfile
CHANGED
data/Rakefile
CHANGED
@@ -14,14 +14,16 @@ task :enable_coverage do
|
|
14
14
|
ENV['COVERAGE'] = 'yes'
|
15
15
|
end
|
16
16
|
|
17
|
+
desc %(Run Test::Unit tests)
|
17
18
|
task :test do
|
18
19
|
sh 'ruby', '-Ilib', 'spec/caching_test.rb'
|
19
20
|
end
|
20
21
|
|
22
|
+
desc %(Check code quality metrics with Cane)
|
21
23
|
task :quality do
|
22
24
|
sh 'cane',
|
23
|
-
'--abc-max=
|
24
|
-
'--style-measure=
|
25
|
+
'--abc-max=15',
|
26
|
+
'--style-measure=110',
|
25
27
|
'--gte=coverage/covered_percent,99',
|
26
|
-
'--max-violations=
|
28
|
+
'--max-violations=0'
|
27
29
|
end
|
data/lib/faraday_middleware.rb
CHANGED
@@ -4,12 +4,14 @@ module FaradayMiddleware
|
|
4
4
|
autoload :OAuth, 'faraday_middleware/request/oauth'
|
5
5
|
autoload :OAuth2, 'faraday_middleware/request/oauth2'
|
6
6
|
autoload :EncodeJson, 'faraday_middleware/request/encode_json'
|
7
|
+
autoload :MethodOverride, 'faraday_middleware/request/method_override'
|
7
8
|
autoload :Mashify, 'faraday_middleware/response/mashify'
|
8
9
|
autoload :Rashify, 'faraday_middleware/response/rashify'
|
9
10
|
autoload :ParseJson, 'faraday_middleware/response/parse_json'
|
10
11
|
autoload :ParseXml, 'faraday_middleware/response/parse_xml'
|
11
12
|
autoload :ParseMarshal, 'faraday_middleware/response/parse_marshal'
|
12
13
|
autoload :ParseYaml, 'faraday_middleware/response/parse_yaml'
|
14
|
+
autoload :ParseDates, 'faraday_middleware/response/parse_dates'
|
13
15
|
autoload :Caching, 'faraday_middleware/response/caching'
|
14
16
|
autoload :Chunked, 'faraday_middleware/response/chunked'
|
15
17
|
autoload :RackCompatible, 'faraday_middleware/rack_compatible'
|
@@ -20,7 +22,8 @@ module FaradayMiddleware
|
|
20
22
|
Faraday.register_middleware :request,
|
21
23
|
:oauth => lambda { OAuth },
|
22
24
|
:oauth2 => lambda { OAuth2 },
|
23
|
-
:json => lambda { EncodeJson }
|
25
|
+
:json => lambda { EncodeJson },
|
26
|
+
:method_override => lambda { MethodOverride }
|
24
27
|
|
25
28
|
Faraday.register_middleware :response,
|
26
29
|
:mashify => lambda { Mashify },
|
@@ -30,6 +33,7 @@ module FaradayMiddleware
|
|
30
33
|
:xml => lambda { ParseXml },
|
31
34
|
:marshal => lambda { ParseMarshal },
|
32
35
|
:yaml => lambda { ParseYaml },
|
36
|
+
:dates => lambda { ParseDates },
|
33
37
|
:caching => lambda { Caching },
|
34
38
|
:follow_redirects => lambda { FollowRedirects },
|
35
39
|
:chunked => lambda { Chunked }
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module FaradayMiddleware
|
4
|
+
# Public: Writes the original HTTP method to "X-Http-Method-Override" header
|
5
|
+
# and sends the request as POST.
|
6
|
+
#
|
7
|
+
# This can be used to work around technical issues with making non-POST
|
8
|
+
# requests, e.g. faulty HTTP client or server router.
|
9
|
+
#
|
10
|
+
# This header is recognized in Rack apps by default, courtesy of the
|
11
|
+
# Rack::MethodOverride module. See
|
12
|
+
# http://rack.rubyforge.org/doc/classes/Rack/MethodOverride.html
|
13
|
+
class MethodOverride < Faraday::Middleware
|
14
|
+
|
15
|
+
HEADER = "X-Http-Method-Override".freeze
|
16
|
+
|
17
|
+
# Public: Initialize the middleware.
|
18
|
+
#
|
19
|
+
# app - the Faraday app to wrap
|
20
|
+
# options - (optional)
|
21
|
+
# :rewrite - Array of HTTP methods to rewrite
|
22
|
+
# (default: all but GET and POST)
|
23
|
+
def initialize(app, options = nil)
|
24
|
+
super(app)
|
25
|
+
@methods = options && options.fetch(:rewrite).map { |method|
|
26
|
+
method = method.downcase if method.respond_to? :downcase
|
27
|
+
method.to_sym
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def call(env)
|
32
|
+
method = env[:method]
|
33
|
+
rewrite_request(env, method) if rewrite_request?(method)
|
34
|
+
@app.call(env)
|
35
|
+
end
|
36
|
+
|
37
|
+
def rewrite_request?(method)
|
38
|
+
if @methods.nil? or @methods.empty?
|
39
|
+
method != :get and method != :post
|
40
|
+
else
|
41
|
+
@methods.include? method
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# Internal: Write the original HTTP method to header, change method to POST.
|
46
|
+
def rewrite_request(env, original_method)
|
47
|
+
env[:request_headers][HEADER] = original_method.to_s.upcase
|
48
|
+
env[:method] = :post
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -34,7 +34,7 @@ module FaradayMiddleware
|
|
34
34
|
# words, it doesn't support parallelism.
|
35
35
|
class FollowRedirects < Faraday::Middleware
|
36
36
|
# HTTP methods for which 30x redirects can be followed
|
37
|
-
ALLOWED_METHODS = Set.new [:get, :post, :put, :patch, :delete]
|
37
|
+
ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete]
|
38
38
|
# HTTP redirect status codes that this middleware implements
|
39
39
|
REDIRECT_CODES = Set.new [301, 302, 303, 307]
|
40
40
|
# Keys in env hash which will get cleared between requests
|
@@ -68,6 +68,9 @@ module FaradayMiddleware
|
|
68
68
|
private
|
69
69
|
|
70
70
|
def transform_into_get?(response)
|
71
|
+
return false if [:head, :options].include? response.env[:method]
|
72
|
+
# Never convert head or options to a get. That would just be silly.
|
73
|
+
|
71
74
|
!@replay_request_codes.include? response.status
|
72
75
|
end
|
73
76
|
|
@@ -87,7 +90,10 @@ module FaradayMiddleware
|
|
87
90
|
|
88
91
|
def update_env(env, request_body, response)
|
89
92
|
env[:url] += response['location']
|
90
|
-
|
93
|
+
if @options[:cookies]
|
94
|
+
cookies = keep_cookies(env)
|
95
|
+
env[:request_headers][:cookies] = cookies unless cookies.nil?
|
96
|
+
end
|
91
97
|
|
92
98
|
if transform_into_get?(response)
|
93
99
|
env[:method] = :get
|
data/spec/caching_test.rb
CHANGED
@@ -152,4 +152,4 @@ class HttpCachingTest < Test::Unit::TestCase
|
|
152
152
|
assert_equal 'request:2', post('/').body
|
153
153
|
assert_equal 'request:3', post('/').body
|
154
154
|
end
|
155
|
-
end unless defined? RUBY_ENGINE and "rbx" == RUBY_ENGINE
|
155
|
+
end unless defined? RUBY_ENGINE and "rbx" == RUBY_ENGINE # rbx bug #1522
|
data/spec/chunked_spec.rb
CHANGED
@@ -4,15 +4,15 @@ require 'faraday_middleware/response/chunked'
|
|
4
4
|
describe FaradayMiddleware::Chunked, :type => :response do
|
5
5
|
context "no transfer-encoding" do
|
6
6
|
it "doesn't change nil body" do
|
7
|
-
process(nil).body.
|
7
|
+
expect(process(nil).body).to be_nil
|
8
8
|
end
|
9
9
|
|
10
10
|
it "doesn't change an empty body" do
|
11
|
-
process('').body.
|
11
|
+
expect(process('').body).to eq('')
|
12
12
|
end
|
13
13
|
|
14
14
|
it "doesn't change a normal body" do
|
15
|
-
process('asdf').body.
|
15
|
+
expect(process('asdf').body).to eq('asdf')
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
@@ -20,15 +20,15 @@ describe FaradayMiddleware::Chunked, :type => :response do
|
|
20
20
|
let(:headers) { {"transfer-encoding" => "gzip"}}
|
21
21
|
|
22
22
|
it "doesn't change nil body" do
|
23
|
-
process(nil).body.
|
23
|
+
expect(process(nil).body).to be_nil
|
24
24
|
end
|
25
25
|
|
26
26
|
it "doesn't change an empty body" do
|
27
|
-
process('').body.
|
27
|
+
expect(process('').body).to eq('')
|
28
28
|
end
|
29
29
|
|
30
30
|
it "doesn't change a normal body" do
|
31
|
-
process('asdf').body.
|
31
|
+
expect(process('asdf').body).to eq('asdf')
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -36,35 +36,35 @@ describe FaradayMiddleware::Chunked, :type => :response do
|
|
36
36
|
let(:headers) { {"transfer-encoding" => "chunked"}}
|
37
37
|
|
38
38
|
it "doesn't change nil body" do
|
39
|
-
process(nil).body.
|
39
|
+
expect(process(nil).body).to be_nil
|
40
40
|
end
|
41
41
|
|
42
42
|
it "doesn't change an empty body" do
|
43
|
-
process('').body.
|
43
|
+
expect(process('').body).to eq('')
|
44
44
|
end
|
45
45
|
|
46
46
|
it "parses a basic chunked body" do
|
47
|
-
process("10\r\nasdfghjklasdfghj\r\n0\r\n").body.
|
47
|
+
expect(process("10\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
48
48
|
end
|
49
49
|
|
50
50
|
it "parses a chunked body with no ending chunk" do
|
51
|
-
process("10\r\nasdfghjklasdfghj\r\n").body.
|
51
|
+
expect(process("10\r\nasdfghjklasdfghj\r\n").body).to eq('asdfghjklasdfghj')
|
52
52
|
end
|
53
53
|
|
54
54
|
it "parses a chunked body with no trailing CRLF on the data chunk" do
|
55
|
-
process("10\r\nasdfghjklasdfghj0\r\n").body.
|
55
|
+
expect(process("10\r\nasdfghjklasdfghj0\r\n").body).to eq('asdfghjklasdfghj')
|
56
56
|
end
|
57
57
|
|
58
58
|
it "parses a chunked body with an extension" do
|
59
|
-
process("10;foo=bar\r\nasdfghjklasdfghj\r\n0\r\n").body.
|
59
|
+
expect(process("10;foo=bar\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
60
60
|
end
|
61
61
|
|
62
62
|
it "parses a chunked body with two extensions" do
|
63
|
-
process("10;foo=bar;bar=baz\r\nasdfghjklasdfghj\r\n0\r\n").body.
|
63
|
+
expect(process("10;foo=bar;bar=baz\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
64
64
|
end
|
65
65
|
|
66
66
|
it "parses a chunked body with two chunks" do
|
67
|
-
process("8\r\nasdfghjk\r\n8\r\nlasdfghj\r\n0\r\n").body.
|
67
|
+
expect(process("8\r\nasdfghjk\r\n8\r\nlasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
@@ -72,7 +72,7 @@ describe FaradayMiddleware::Chunked, :type => :response do
|
|
72
72
|
let(:headers) { {"transfer-encoding" => "chunked,chunked"}}
|
73
73
|
|
74
74
|
it "parses a basic chunked body" do
|
75
|
-
process("10\r\nasdfghjklasdfghj\r\n0\r\n").body.
|
75
|
+
expect(process("10\r\nasdfghjklasdfghj\r\n0\r\n").body).to eq('asdfghjklasdfghj')
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
data/spec/encode_json_spec.rb
CHANGED
@@ -17,11 +17,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
17
17
|
let(:result) { process(nil) }
|
18
18
|
|
19
19
|
it "doesn't change body" do
|
20
|
-
result_body.
|
20
|
+
expect(result_body).to be_nil
|
21
21
|
end
|
22
22
|
|
23
23
|
it "doesn't add content type" do
|
24
|
-
result_type.
|
24
|
+
expect(result_type).to be_nil
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -29,11 +29,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
29
29
|
let(:result) { process('') }
|
30
30
|
|
31
31
|
it "doesn't change body" do
|
32
|
-
result_body.
|
32
|
+
expect(result_body).to be_empty
|
33
33
|
end
|
34
34
|
|
35
35
|
it "doesn't add content type" do
|
36
|
-
result_type.
|
36
|
+
expect(result_type).to be_nil
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -41,11 +41,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
41
41
|
let(:result) { process('{"a":1}') }
|
42
42
|
|
43
43
|
it "doesn't change body" do
|
44
|
-
result_body.
|
44
|
+
expect(result_body).to eq('{"a":1}')
|
45
45
|
end
|
46
46
|
|
47
47
|
it "adds content type" do
|
48
|
-
result_type.
|
48
|
+
expect(result_type).to eq('application/json')
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -53,11 +53,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
53
53
|
let(:result) { process({:a => 1}) }
|
54
54
|
|
55
55
|
it "encodes body" do
|
56
|
-
result_body.
|
56
|
+
expect(result_body).to eq('{"a":1}')
|
57
57
|
end
|
58
58
|
|
59
59
|
it "adds content type" do
|
60
|
-
result_type.
|
60
|
+
expect(result_type).to eq('application/json')
|
61
61
|
end
|
62
62
|
end
|
63
63
|
|
@@ -65,7 +65,7 @@ describe FaradayMiddleware::EncodeJson do
|
|
65
65
|
let(:result) { process({}) }
|
66
66
|
|
67
67
|
it "encodes body" do
|
68
|
-
result_body.
|
68
|
+
expect(result_body).to eq('{}')
|
69
69
|
end
|
70
70
|
end
|
71
71
|
|
@@ -73,11 +73,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
73
73
|
let(:result) { process({:a => 1}, 'application/json; charset=utf-8') }
|
74
74
|
|
75
75
|
it "encodes body" do
|
76
|
-
result_body.
|
76
|
+
expect(result_body).to eq('{"a":1}')
|
77
77
|
end
|
78
78
|
|
79
79
|
it "doesn't change content type" do
|
80
|
-
result_type.
|
80
|
+
expect(result_type).to eq('application/json; charset=utf-8')
|
81
81
|
end
|
82
82
|
end
|
83
83
|
|
@@ -85,11 +85,11 @@ describe FaradayMiddleware::EncodeJson do
|
|
85
85
|
let(:result) { process({:a => 1}, 'application/xml; charset=utf-8') }
|
86
86
|
|
87
87
|
it "doesn't change body" do
|
88
|
-
result_body.
|
88
|
+
expect(result_body).to eq({:a => 1})
|
89
89
|
end
|
90
90
|
|
91
91
|
it "doesn't change content type" do
|
92
|
-
result_type.
|
92
|
+
expect(result_type).to eq('application/xml; charset=utf-8')
|
93
93
|
end
|
94
94
|
end
|
95
95
|
end
|
@@ -8,27 +8,33 @@ Faraday::Adapter::Test::Stubs.class_eval { public :new_stub }
|
|
8
8
|
describe FaradayMiddleware::FollowRedirects do
|
9
9
|
let(:middleware_options) { Hash.new }
|
10
10
|
|
11
|
-
shared_examples_for
|
11
|
+
shared_examples_for "a successful redirection" do |status_code|
|
12
12
|
it "follows the redirection for a GET request" do
|
13
|
-
connection do |stub|
|
13
|
+
expect(connection do |stub|
|
14
14
|
stub.get('/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
15
15
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
16
|
-
end.get('/permanent').body.
|
16
|
+
end.get('/permanent').body).to eq 'fin'
|
17
17
|
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
19
|
+
it "follows the redirection for a HEAD request" do
|
20
|
+
expect(connection do |stub|
|
21
|
+
stub.head('/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
22
|
+
stub.head('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
23
|
+
end.head('/permanent').status).to eq 200
|
24
|
+
end
|
25
|
+
|
26
|
+
it "follows the redirection for a OPTIONS request" do
|
27
|
+
expect(connection do |stub|
|
28
|
+
stub.new_stub(:options, '/permanent') { [status_code, {'Location' => '/found'}, ''] }
|
29
|
+
stub.new_stub(:options, '/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
30
|
+
end.run_request(:options, '/permanent', nil, nil).status).to eq 200
|
25
31
|
end
|
26
32
|
end
|
27
33
|
|
28
|
-
shared_examples_for
|
34
|
+
shared_examples_for "a forced GET redirection" do |status_code|
|
29
35
|
[:put, :post, :delete, :patch].each do |method|
|
30
36
|
it "a #{method.to_s.upcase} request is converted to a GET" do
|
31
|
-
connection
|
37
|
+
expect(connection do |stub|
|
32
38
|
stub.new_stub(method, '/redirect') {
|
33
39
|
[status_code, {'Location' => '/found'}, 'elsewhere']
|
34
40
|
}
|
@@ -36,13 +42,13 @@ describe FaradayMiddleware::FollowRedirects do
|
|
36
42
|
body = env[:body] and body.empty? && (body = nil)
|
37
43
|
[200, {'Content-Type' => 'text/plain'}, body.inspect]
|
38
44
|
}
|
39
|
-
end.run_request(method, '/redirect', 'request data', nil).body.
|
45
|
+
end.run_request(method, '/redirect', 'request data', nil).body).to eq('nil')
|
40
46
|
end
|
41
47
|
end
|
42
48
|
end
|
43
49
|
|
44
|
-
shared_examples_for
|
45
|
-
it
|
50
|
+
shared_examples_for "a replayed redirection" do |status_code|
|
51
|
+
it "redirects with the original request headers" do
|
46
52
|
conn = connection do |stub|
|
47
53
|
stub.get('/redirect') {
|
48
54
|
[status_code, {'Location' => '/found'}, '']
|
@@ -56,15 +62,15 @@ describe FaradayMiddleware::FollowRedirects do
|
|
56
62
|
req.headers['X-Test-Value'] = 'success'
|
57
63
|
}
|
58
64
|
|
59
|
-
response.body.
|
65
|
+
expect(response.body).to eq('success')
|
60
66
|
end
|
61
67
|
|
62
68
|
[:put, :post, :delete, :patch].each do |method|
|
63
69
|
it "replays a #{method.to_s.upcase} request" do
|
64
|
-
connection do |stub|
|
70
|
+
expect(connection do |stub|
|
65
71
|
stub.new_stub(method, '/redirect') { [status_code, {'Location' => '/found'}, ''] }
|
66
72
|
stub.new_stub(method, '/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
67
|
-
end.run_request(method, '/redirect', nil, nil).body.
|
73
|
+
end.run_request(method, '/redirect', nil, nil).body).to eq 'fin'
|
68
74
|
end
|
69
75
|
end
|
70
76
|
|
@@ -80,32 +86,32 @@ describe FaradayMiddleware::FollowRedirects do
|
|
80
86
|
end
|
81
87
|
|
82
88
|
response = conn.run_request(method, '/redirect', 'original data', nil)
|
83
|
-
response.body.
|
89
|
+
expect(response.body).to eq('original data')
|
84
90
|
end
|
85
91
|
end
|
86
92
|
end
|
87
93
|
|
88
94
|
|
89
95
|
it "returns non-redirect response results" do
|
90
|
-
connection do |stub|
|
96
|
+
expect(connection do |stub|
|
91
97
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
92
|
-
end.get('/found').body.
|
98
|
+
end.get('/found').body).to eq 'fin'
|
93
99
|
end
|
94
100
|
|
95
101
|
it "follows a single redirection" do
|
96
|
-
connection do |stub|
|
102
|
+
expect(connection do |stub|
|
97
103
|
stub.get('/') { [301, {'Location' => '/found'}, ''] }
|
98
104
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
99
|
-
end.get('/').body.
|
105
|
+
end.get('/').body).to eq 'fin'
|
100
106
|
end
|
101
107
|
|
102
108
|
it "follows many redirections" do
|
103
|
-
connection do |stub|
|
109
|
+
expect(connection do |stub|
|
104
110
|
stub.get('/') { [301, {'Location' => '/redirect1'}, ''] }
|
105
111
|
stub.get('/redirect1') { [301, {'Location' => '/redirect2'}, ''] }
|
106
112
|
stub.get('/redirect2') { [301, {'Location' => '/found'}, ''] }
|
107
113
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
108
|
-
end.get('/').body.
|
114
|
+
end.get('/').body).to eq 'fin'
|
109
115
|
end
|
110
116
|
|
111
117
|
it "raises a FaradayMiddleware::RedirectLimitReached after 3 redirections (by default)" do
|
@@ -117,7 +123,7 @@ describe FaradayMiddleware::FollowRedirects do
|
|
117
123
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
118
124
|
end
|
119
125
|
|
120
|
-
expect
|
126
|
+
expect{ conn.get('/') }.to raise_error(FaradayMiddleware::RedirectLimitReached)
|
121
127
|
end
|
122
128
|
|
123
129
|
it "raises a FaradayMiddleware::RedirectLimitReached after the initialized limit" do
|
@@ -127,58 +133,65 @@ describe FaradayMiddleware::FollowRedirects do
|
|
127
133
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, 'fin'] }
|
128
134
|
end
|
129
135
|
|
130
|
-
expect
|
136
|
+
expect{ conn.get('/') }.to raise_error(FaradayMiddleware::RedirectLimitReached)
|
131
137
|
end
|
132
138
|
|
133
|
-
context
|
139
|
+
context "when cookies option" do
|
134
140
|
|
135
141
|
let(:cookies) { 'cookie1=abcdefg; cookie2=1234567; cookie3=awesome' }
|
136
142
|
|
137
143
|
context "is :all" do
|
138
144
|
it "puts all cookies from the response into the next request" do
|
139
|
-
|
145
|
+
expect(connection(:cookies => :all) do |stub|
|
140
146
|
stub.get('/') { [301, {'Location' => '/found', 'Cookies' => cookies }, ''] }
|
141
147
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
142
|
-
end.get('/').env[:request_headers][:cookies].
|
148
|
+
end.get('/').env[:request_headers][:cookies]).to eq(cookies)
|
149
|
+
end
|
150
|
+
|
151
|
+
it "not set cookies header on request when response has no cookies" do
|
152
|
+
expect(connection(:cookies => :all) do |stub|
|
153
|
+
stub.get('/') { [301, {'Location' => '/found'}, ''] }
|
154
|
+
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
155
|
+
end.get('/').env[:request_headers].has_key?('Cookies')).to eq(false)
|
143
156
|
end
|
144
157
|
end
|
145
158
|
|
146
159
|
context "is an array of cookie names" do
|
147
160
|
it "puts selected cookies from the response into the next request" do
|
148
|
-
|
161
|
+
expect(connection(:cookies => ['cookie2']) do |stub|
|
149
162
|
stub.get('/') { [301, {'Location' => '/found', 'Cookies' => cookies }, ''] }
|
150
163
|
stub.get('/found') { [200, {'Content-Type' => 'text/plain'}, ''] }
|
151
|
-
end.get('/').env[:request_headers][:cookies].
|
164
|
+
end.get('/').env[:request_headers][:cookies]).to eq('cookie2=1234567')
|
152
165
|
end
|
153
166
|
end
|
154
167
|
end
|
155
168
|
|
156
|
-
context
|
157
|
-
|
158
|
-
|
169
|
+
context "for an HTTP 301 response" do
|
170
|
+
it_behaves_like 'a successful redirection', 301
|
171
|
+
it_behaves_like 'a forced GET redirection', 301
|
159
172
|
end
|
160
173
|
|
161
|
-
context
|
162
|
-
|
174
|
+
context "for an HTTP 302 response" do
|
175
|
+
it_behaves_like 'a successful redirection', 302
|
163
176
|
|
164
|
-
context
|
165
|
-
|
177
|
+
context "by default" do
|
178
|
+
it_behaves_like 'a forced GET redirection', 302
|
166
179
|
end
|
167
180
|
|
168
|
-
context
|
181
|
+
context "with standards compliancy enabled" do
|
169
182
|
let(:middleware_options) { { :standards_compliant => true } }
|
170
|
-
|
183
|
+
it_behaves_like 'a replayed redirection', 302
|
171
184
|
end
|
172
185
|
end
|
173
186
|
|
174
|
-
context
|
175
|
-
|
176
|
-
|
187
|
+
context "for an HTTP 303 response" do
|
188
|
+
it_behaves_like 'a successful redirection', 303
|
189
|
+
it_behaves_like 'a forced GET redirection', 303
|
177
190
|
end
|
178
191
|
|
179
|
-
context
|
180
|
-
|
181
|
-
|
192
|
+
context "for an HTTP 307 response" do
|
193
|
+
it_behaves_like 'a successful redirection', 307
|
194
|
+
it_behaves_like 'a replayed redirection', 307
|
182
195
|
end
|
183
196
|
|
184
197
|
# checks env hash in request phase for basic validity
|