faraday_middleware 0.9.1 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +16 -22
  3. data/lib/faraday_middleware/backwards_compatibility.rb +16 -12
  4. data/lib/faraday_middleware/gzip.rb +90 -0
  5. data/lib/faraday_middleware/instrumentation.rb +9 -3
  6. data/lib/faraday_middleware/rack_compatible.rb +18 -11
  7. data/lib/faraday_middleware/redirect_limit_reached.rb +16 -0
  8. data/lib/faraday_middleware/request/encode_json.rb +12 -9
  9. data/lib/faraday_middleware/request/method_override.rb +7 -6
  10. data/lib/faraday_middleware/request/oauth.rb +13 -10
  11. data/lib/faraday_middleware/request/oauth2.rb +37 -12
  12. data/lib/faraday_middleware/response/caching.rb +67 -15
  13. data/lib/faraday_middleware/response/chunked.rb +10 -6
  14. data/lib/faraday_middleware/response/follow_redirects.rb +85 -70
  15. data/lib/faraday_middleware/response/mashify.rb +2 -0
  16. data/lib/faraday_middleware/response/parse_dates.rb +6 -3
  17. data/lib/faraday_middleware/response/parse_json.rb +10 -10
  18. data/lib/faraday_middleware/response/parse_marshal.rb +3 -1
  19. data/lib/faraday_middleware/response/parse_xml.rb +4 -2
  20. data/lib/faraday_middleware/response/parse_yaml.rb +27 -3
  21. data/lib/faraday_middleware/response/rashify.rb +3 -1
  22. data/lib/faraday_middleware/response_middleware.rb +27 -18
  23. data/lib/faraday_middleware/version.rb +4 -1
  24. data/lib/faraday_middleware.rb +22 -16
  25. metadata +10 -65
  26. data/CHANGELOG.md +0 -10
  27. data/CONTRIBUTING.md +0 -46
  28. data/Rakefile +0 -28
  29. data/faraday_middleware.gemspec +0 -23
  30. data/lib/faraday_middleware/addressable_patch.rb +0 -20
  31. data/spec/caching_spec.rb +0 -170
  32. data/spec/chunked_spec.rb +0 -78
  33. data/spec/encode_json_spec.rb +0 -95
  34. data/spec/follow_redirects_spec.rb +0 -221
  35. data/spec/helper.rb +0 -59
  36. data/spec/mashify_spec.rb +0 -70
  37. data/spec/method_override_spec.rb +0 -92
  38. data/spec/oauth2_spec.rb +0 -118
  39. data/spec/oauth_spec.rb +0 -151
  40. data/spec/parse_dates_spec.rb +0 -44
  41. data/spec/parse_json_spec.rb +0 -112
  42. data/spec/parse_marshal_spec.rb +0 -16
  43. data/spec/parse_xml_spec.rb +0 -71
  44. data/spec/parse_yaml_spec.rb +0 -53
  45. data/spec/rashify_spec.rb +0 -47
@@ -1,42 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
 
5
+ # Main FaradayMiddleware module.
3
6
  module FaradayMiddleware
4
7
  # Internal: The base class for middleware that parses responses.
5
8
  class ResponseMiddleware < Faraday::Middleware
6
- CONTENT_TYPE = 'Content-Type'.freeze
9
+ CONTENT_TYPE = 'Content-Type'
7
10
 
8
11
  class << self
9
12
  attr_accessor :parser
10
13
  end
11
14
 
12
15
  # Store a Proc that receives the body and returns the parsed result.
13
- def self.define_parser(parser = nil)
14
- @parser = parser || Proc.new
16
+ def self.define_parser(parser = nil, &block)
17
+ @parser = parser ||
18
+ block ||
19
+ raise(ArgumentError, 'Define parser with a block')
15
20
  end
16
21
 
17
22
  def self.inherited(subclass)
18
23
  super
19
- subclass.load_error = self.load_error if subclass.respond_to? :load_error=
20
- subclass.parser = self.parser
24
+ subclass.load_error = load_error if subclass.respond_to? :load_error=
25
+ subclass.parser = parser
21
26
  end
22
27
 
23
28
  def initialize(app = nil, options = {})
24
29
  super(app)
25
30
  @options = options
31
+ @parser_options = options[:parser_options]
26
32
  @content_types = Array(options[:content_type])
27
33
  end
28
34
 
29
35
  def call(environment)
30
36
  @app.call(environment).on_complete do |env|
31
- if process_response_type?(response_type(env)) and parse_response?(env)
32
- process_response(env)
33
- end
37
+ process_response(env) if process_response_type?(response_type(env)) && parse_response?(env)
34
38
  end
35
39
  end
36
40
 
37
41
  def process_response(env)
38
42
  env[:raw_body] = env[:body] if preserve_raw?(env)
39
43
  env[:body] = parse(env[:body])
44
+ rescue Faraday::ParsingError => e
45
+ raise Faraday::ParsingError.new(e.wrapped_exception, env[:response])
40
46
  end
41
47
 
42
48
  # Parse the response body.
@@ -45,10 +51,12 @@ module FaradayMiddleware
45
51
  def parse(body)
46
52
  if self.class.parser
47
53
  begin
48
- self.class.parser.call(body)
49
- rescue StandardError, SyntaxError => err
50
- raise err if err.is_a? SyntaxError and err.class.name != 'Psych::SyntaxError'
51
- raise Faraday::Error::ParsingError, err
54
+ self.class.parser.call(body, @parser_options)
55
+ rescue StandardError, SyntaxError => e
56
+ raise e if e.is_a?(SyntaxError) &&
57
+ e.class.name != 'Psych::SyntaxError'
58
+
59
+ raise Faraday::ParsingError, e
52
60
  end
53
61
  else
54
62
  body
@@ -62,9 +70,9 @@ module FaradayMiddleware
62
70
  end
63
71
 
64
72
  def process_response_type?(type)
65
- @content_types.empty? or @content_types.any? { |pattern|
73
+ @content_types.empty? || @content_types.any? do |pattern|
66
74
  pattern.is_a?(Regexp) ? type =~ pattern : type == pattern
67
- }
75
+ end
68
76
  end
69
77
 
70
78
  def parse_response?(env)
@@ -81,17 +89,18 @@ module FaradayMiddleware
81
89
  attr_accessor :preserve_raw
82
90
 
83
91
  def to_hash
84
- super.update(:preserve_raw => preserve_raw)
92
+ super.update(preserve_raw: preserve_raw)
85
93
  end
86
94
 
87
95
  def each
88
96
  return to_enum(:each) unless block_given?
97
+
89
98
  super
90
99
  yield :preserve_raw, preserve_raw
91
100
  end
92
101
 
93
102
  def fetch(key, *args)
94
- if :preserve_raw == key
103
+ if key == :preserve_raw
95
104
  value = __send__(key)
96
105
  value.nil? ? args.fetch(0) : value
97
106
  else
@@ -102,9 +111,9 @@ module FaradayMiddleware
102
111
 
103
112
  if defined?(Faraday::RequestOptions)
104
113
  begin
105
- Faraday::RequestOptions.from(:preserve_raw => true)
114
+ Faraday::RequestOptions.from(preserve_raw: true)
106
115
  rescue NoMethodError
107
- Faraday::RequestOptions.send(:include, OptionsExtension)
116
+ Faraday::RequestOptions.include OptionsExtension
108
117
  end
109
118
  end
110
119
  end
@@ -1,3 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Main FaradayMiddleware module.
1
4
  module FaradayMiddleware
2
- VERSION = "0.9.1" unless defined?(FaradayMiddleware::VERSION)
5
+ VERSION = '1.2.0' unless defined?(FaradayMiddleware::VERSION)
3
6
  end
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
 
5
+ # Main FaradayMiddleware module.
3
6
  module FaradayMiddleware
4
7
  autoload :OAuth, 'faraday_middleware/request/oauth'
5
8
  autoload :OAuth2, 'faraday_middleware/request/oauth2'
@@ -15,31 +18,34 @@ module FaradayMiddleware
15
18
  autoload :Caching, 'faraday_middleware/response/caching'
16
19
  autoload :Chunked, 'faraday_middleware/response/chunked'
17
20
  autoload :RackCompatible, 'faraday_middleware/rack_compatible'
21
+ autoload :RedirectLimitReached, 'faraday_middleware/redirect_limit_reached'
18
22
  autoload :FollowRedirects, 'faraday_middleware/response/follow_redirects'
19
23
  autoload :Instrumentation, 'faraday_middleware/instrumentation'
24
+ autoload :Gzip, 'faraday_middleware/gzip'
20
25
 
21
26
  if Faraday::Middleware.respond_to? :register_middleware
22
27
  Faraday::Request.register_middleware \
23
- :oauth => lambda { OAuth },
24
- :oauth2 => lambda { OAuth2 },
25
- :json => lambda { EncodeJson },
26
- :method_override => lambda { MethodOverride }
28
+ oauth: -> { OAuth },
29
+ oauth2: -> { OAuth2 },
30
+ json: -> { EncodeJson },
31
+ method_override: -> { MethodOverride }
27
32
 
28
33
  Faraday::Response.register_middleware \
29
- :mashify => lambda { Mashify },
30
- :rashify => lambda { Rashify },
31
- :json => lambda { ParseJson },
32
- :json_fix => lambda { ParseJson::MimeTypeFix },
33
- :xml => lambda { ParseXml },
34
- :marshal => lambda { ParseMarshal },
35
- :yaml => lambda { ParseYaml },
36
- :dates => lambda { ParseDates },
37
- :caching => lambda { Caching },
38
- :follow_redirects => lambda { FollowRedirects },
39
- :chunked => lambda { Chunked }
34
+ mashify: -> { Mashify },
35
+ rashify: -> { Rashify },
36
+ json: -> { ParseJson },
37
+ json_fix: -> { ParseJson::MimeTypeFix },
38
+ xml: -> { ParseXml },
39
+ marshal: -> { ParseMarshal },
40
+ yaml: -> { ParseYaml },
41
+ dates: -> { ParseDates },
42
+ caching: -> { Caching },
43
+ follow_redirects: -> { FollowRedirects },
44
+ chunked: -> { Chunked }
40
45
 
41
46
  Faraday::Middleware.register_middleware \
42
- :instrumentation => lambda { Instrumentation }
47
+ instrumentation: -> { Instrumentation },
48
+ gzip: -> { Gzip }
43
49
  end
44
50
  end
45
51
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday_middleware
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Erik Michaels-Ober
@@ -9,43 +9,23 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-04-19 00:00:00.000000000 Z
12
+ date: 2021-10-14 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: faraday
16
- requirement: !ruby/object:Gem::Requirement
17
- requirements:
18
- - - ">="
19
- - !ruby/object:Gem::Version
20
- version: 0.7.4
21
- - - "<"
22
- - !ruby/object:Gem::Version
23
- version: '0.10'
24
- type: :runtime
25
- prerelease: false
26
- version_requirements: !ruby/object:Gem::Requirement
27
- requirements:
28
- - - ">="
29
- - !ruby/object:Gem::Version
30
- version: 0.7.4
31
- - - "<"
32
- - !ruby/object:Gem::Version
33
- version: '0.10'
34
- - !ruby/object:Gem::Dependency
35
- name: bundler
36
16
  requirement: !ruby/object:Gem::Requirement
37
17
  requirements:
38
18
  - - "~>"
39
19
  - !ruby/object:Gem::Version
40
20
  version: '1.0'
41
- type: :development
21
+ type: :runtime
42
22
  prerelease: false
43
23
  version_requirements: !ruby/object:Gem::Requirement
44
24
  requirements:
45
25
  - - "~>"
46
26
  - !ruby/object:Gem::Version
47
27
  version: '1.0'
48
- description: Various middleware for Faraday
28
+ description:
49
29
  email:
50
30
  - sferik@gmail.com
51
31
  - wynn.netherland@gmail.com
@@ -53,17 +33,14 @@ executables: []
53
33
  extensions: []
54
34
  extra_rdoc_files: []
55
35
  files:
56
- - CHANGELOG.md
57
- - CONTRIBUTING.md
58
36
  - LICENSE.md
59
37
  - README.md
60
- - Rakefile
61
- - faraday_middleware.gemspec
62
38
  - lib/faraday_middleware.rb
63
- - lib/faraday_middleware/addressable_patch.rb
64
39
  - lib/faraday_middleware/backwards_compatibility.rb
40
+ - lib/faraday_middleware/gzip.rb
65
41
  - lib/faraday_middleware/instrumentation.rb
66
42
  - lib/faraday_middleware/rack_compatible.rb
43
+ - lib/faraday_middleware/redirect_limit_reached.rb
67
44
  - lib/faraday_middleware/request/encode_json.rb
68
45
  - lib/faraday_middleware/request/method_override.rb
69
46
  - lib/faraday_middleware/request/oauth.rb
@@ -80,21 +57,6 @@ files:
80
57
  - lib/faraday_middleware/response/rashify.rb
81
58
  - lib/faraday_middleware/response_middleware.rb
82
59
  - lib/faraday_middleware/version.rb
83
- - spec/caching_spec.rb
84
- - spec/chunked_spec.rb
85
- - spec/encode_json_spec.rb
86
- - spec/follow_redirects_spec.rb
87
- - spec/helper.rb
88
- - spec/mashify_spec.rb
89
- - spec/method_override_spec.rb
90
- - spec/oauth2_spec.rb
91
- - spec/oauth_spec.rb
92
- - spec/parse_dates_spec.rb
93
- - spec/parse_json_spec.rb
94
- - spec/parse_marshal_spec.rb
95
- - spec/parse_xml_spec.rb
96
- - spec/parse_yaml_spec.rb
97
- - spec/rashify_spec.rb
98
60
  homepage: https://github.com/lostisland/faraday_middleware
99
61
  licenses:
100
62
  - MIT
@@ -107,32 +69,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
107
69
  requirements:
108
70
  - - ">="
109
71
  - !ruby/object:Gem::Version
110
- version: '0'
72
+ version: '2.3'
111
73
  required_rubygems_version: !ruby/object:Gem::Requirement
112
74
  requirements:
113
75
  - - ">="
114
76
  - !ruby/object:Gem::Version
115
- version: 1.3.5
77
+ version: '0'
116
78
  requirements: []
117
- rubyforge_project:
118
- rubygems_version: 2.2.0
79
+ rubygems_version: 3.0.3.1
119
80
  signing_key:
120
81
  specification_version: 4
121
82
  summary: Various middleware for Faraday
122
- test_files:
123
- - spec/caching_spec.rb
124
- - spec/chunked_spec.rb
125
- - spec/encode_json_spec.rb
126
- - spec/follow_redirects_spec.rb
127
- - spec/helper.rb
128
- - spec/mashify_spec.rb
129
- - spec/method_override_spec.rb
130
- - spec/oauth2_spec.rb
131
- - spec/oauth_spec.rb
132
- - spec/parse_dates_spec.rb
133
- - spec/parse_json_spec.rb
134
- - spec/parse_marshal_spec.rb
135
- - spec/parse_xml_spec.rb
136
- - spec/parse_yaml_spec.rb
137
- - spec/rashify_spec.rb
138
- has_rdoc:
83
+ test_files: []
data/CHANGELOG.md DELETED
@@ -1,10 +0,0 @@
1
- # Changelog
2
-
3
- ### 0.0.2 September 25, 2010
4
-
5
- * Mashify now handles arrays of non-hashes
6
-
7
- ### 0.0.1 June 27, 2010
8
-
9
- * MultiJSON
10
- * Mashify
data/CONTRIBUTING.md DELETED
@@ -1,46 +0,0 @@
1
- ## Contributing
2
- In the spirit of [free software][free-sw], **everyone** is encouraged to help
3
- improve this project.
4
-
5
- [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
6
-
7
- Here are some ways *you* can contribute:
8
-
9
- * by using alpha, beta, and prerelease versions
10
- * by reporting bugs
11
- * by suggesting new features
12
- * by writing or editing documentation
13
- * by writing specifications
14
- * by writing code (**no patch is too small**: fix typos, add comments, clean up
15
- inconsistent whitespace)
16
- * by refactoring code
17
- * by fixing [issues][]
18
- * by reviewing patches
19
-
20
- [issues]: https://github.com/lostisland/faraday_middleware/issues
21
-
22
- ## Submitting an Issue
23
- We use the [GitHub issue tracker][issues] to track bugs and features. Before
24
- submitting a bug report or feature request, check to make sure it hasn't
25
- already been submitted. When submitting a bug report, please include a [Gist][]
26
- that includes a stack trace and any details that may be necessary to reproduce
27
- the bug, including your gem version, Ruby version, and operating system.
28
- Ideally, a bug report should include a pull request with failing specs.
29
-
30
- [gist]: https://gist.github.com/
31
-
32
- ## Submitting a Pull Request
33
- 1. [Fork the repository.][fork]
34
- 2. [Create a topic branch.][branch]
35
- 3. Add specs for your unimplemented feature or bug fix.
36
- 4. Run `bundle exec rake spec`. If your specs pass, return to step 3.
37
- 5. Implement your feature or bug fix.
38
- 6. Run `bundle exec rake spec`. If your specs fail, return to step 5.
39
- 7. Run `open coverage/index.html`. If your changes are not completely covered
40
- by your tests, return to step 3.
41
- 8. Add, commit, and push your changes.
42
- 9. [Submit a pull request.][pr]
43
-
44
- [fork]: http://help.github.com/fork-a-repo/
45
- [branch]: http://learn.github.com/p/branching.html
46
- [pr]: http://help.github.com/send-pull-requests/
data/Rakefile DELETED
@@ -1,28 +0,0 @@
1
- ruby_19 = RUBY_VERSION > '1.9'
2
- ruby_mri = !defined?(RUBY_ENGINE) || 'ruby' == RUBY_ENGINE
3
- default_gemfile = ENV['BUNDLE_GEMFILE'] =~ /Gemfile$/
4
-
5
- if ruby_19 && ruby_mri && default_gemfile
6
- task :default => [:enable_coverage, :spec, :quality]
7
- else
8
- task :default => [:spec]
9
- end
10
-
11
- require 'bundler'
12
- Bundler::GemHelper.install_tasks
13
-
14
- require 'rspec/core/rake_task'
15
- RSpec::Core::RakeTask.new(:spec)
16
-
17
- task :enable_coverage do
18
- ENV['COVERAGE'] = 'yes'
19
- end
20
-
21
- desc %(Check code quality metrics with Cane)
22
- task :quality do
23
- sh 'cane',
24
- '--abc-max=15',
25
- '--style-measure=110',
26
- '--gte=coverage/covered_percent,98.9',
27
- '--max-violations=0'
28
- end
@@ -1,23 +0,0 @@
1
- # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'faraday_middleware/version'
5
-
6
- Gem::Specification.new do |spec|
7
- spec.add_dependency 'faraday', ['>= 0.7.4', '< 0.10']
8
- spec.add_development_dependency 'bundler', '~> 1.0'
9
- spec.authors = ["Erik Michaels-Ober", "Wynn Netherland"]
10
- spec.description = %q{Various middleware for Faraday}
11
- spec.email = ['sferik@gmail.com', 'wynn.netherland@gmail.com']
12
- spec.files = %w(CHANGELOG.md CONTRIBUTING.md LICENSE.md README.md Rakefile faraday_middleware.gemspec)
13
- spec.files += Dir.glob("lib/**/*.rb")
14
- spec.files += Dir.glob("spec/**/*")
15
- spec.homepage = 'https://github.com/lostisland/faraday_middleware'
16
- spec.licenses = ['MIT']
17
- spec.name = 'faraday_middleware'
18
- spec.require_paths = ['lib']
19
- spec.required_rubygems_version = '>= 1.3.5'
20
- spec.summary = spec.description
21
- spec.test_files += Dir.glob("spec/**/*")
22
- spec.version = FaradayMiddleware::VERSION
23
- end
@@ -1,20 +0,0 @@
1
- require 'addressable/uri'
2
-
3
- # feature-detect the bug
4
- unless Addressable::URI.parse('/?a=1&b=2') === '/?b=2&a=1'
5
- # fix `normalized_query` by sorting query key-value pairs
6
- # (rejected: https://github.com/sporkmonger/addressable/issues/28)
7
- class Addressable::URI
8
- alias normalized_query_without_ordering_fix normalized_query
9
-
10
- def normalized_query
11
- fresh = @normalized_query.nil?
12
- query = normalized_query_without_ordering_fix
13
- if query && fresh
14
- @normalized_query = query.split('&', -1).sort_by {|q| q[0..(q.index('=')||-1)] }.join('&')
15
- else
16
- query
17
- end
18
- end
19
- end
20
- end
data/spec/caching_spec.rb DELETED
@@ -1,170 +0,0 @@
1
- require 'helper'
2
- require 'forwardable'
3
- require 'fileutils'
4
- require 'rack/cache'
5
- require 'faraday'
6
- require 'faraday_middleware/response/caching'
7
- require 'faraday_middleware/rack_compatible'
8
-
9
- describe FaradayMiddleware::Caching do
10
- before do
11
- @cache = TestCache.new
12
- request_count = 0
13
- response = lambda { |env|
14
- [200, {'Content-Type' => 'text/plain'}, "request:#{request_count+=1}"]
15
- }
16
-
17
- @conn = Faraday.new do |b|
18
- b.use CachingLint
19
- b.use FaradayMiddleware::Caching, @cache, options
20
- b.adapter :test do |stub|
21
- stub.get('/', &response)
22
- stub.get('/?foo=bar', &response)
23
- stub.post('/', &response)
24
- stub.get('/other', &response)
25
- end
26
- end
27
- end
28
-
29
- let(:options) { {} }
30
-
31
- extend Forwardable
32
- def_delegators :@conn, :get, :post
33
-
34
- it 'caches get requests' do
35
- expect(get('/').body).to eq('request:1')
36
- expect(get('/').body).to eq('request:1')
37
- expect(get('/other').body).to eq('request:2')
38
- expect(get('/other').body).to eq('request:2')
39
- end
40
-
41
- it 'includes request params in the response' do
42
- get('/') # make cache
43
- response = get('/')
44
- expect(response.env[:method]).to eq(:get)
45
- expect(response.env[:url].request_uri).to eq('/')
46
- end
47
-
48
- it 'caches requests with query params' do
49
- expect(get('/').body).to eq('request:1')
50
- expect(get('/?foo=bar').body).to eq('request:2')
51
- expect(get('/?foo=bar').body).to eq('request:2')
52
- expect(get('/').body).to eq('request:1')
53
- end
54
-
55
- it 'does not cache post requests' do
56
- expect(post('/').body).to eq('request:1')
57
- expect(post('/').body).to eq('request:2')
58
- expect(post('/').body).to eq('request:3')
59
- end
60
-
61
- context ":ignore_params" do
62
- let(:options) { {:ignore_params => %w[ utm_source utm_term ]} }
63
-
64
- it "strips ignored parameters from cache_key" do
65
- expect(get('/').body).to eq('request:1')
66
- expect(get('/?utm_source=a').body).to eq('request:1')
67
- expect(get('/?utm_source=a&utm_term=b').body).to eq('request:1')
68
- expect(get('/?utm_source=a&utm_term=b&foo=bar').body).to eq('request:2')
69
- expect(get('/?foo=bar').body).to eq('request:2')
70
- end
71
- end
72
-
73
- class TestCache < Hash
74
- def read(key)
75
- if cached = self[key]
76
- Marshal.load(cached)
77
- end
78
- end
79
-
80
- def write(key, data)
81
- self[key] = Marshal.dump(data)
82
- end
83
-
84
- def fetch(key)
85
- read(key) || yield.tap { |data| write(key, data) }
86
- end
87
- end
88
-
89
- class CachingLint < Struct.new(:app)
90
- def call(env)
91
- app.call(env).on_complete do
92
- raise "no headers" unless env[:response_headers].is_a? Hash
93
- raise "no response" unless env[:response].is_a? Faraday::Response
94
- # raise "env not identical" unless env[:response].env.object_id == env.object_id
95
- end
96
- end
97
- end
98
- end
99
-
100
- # RackCompatible + Rack::Cache
101
- describe FaradayMiddleware::RackCompatible, 'caching' do
102
- include FileUtils
103
-
104
- CACHE_DIR = File.expand_path('../../tmp/cache', __FILE__)
105
-
106
- before do
107
- rm_r CACHE_DIR if File.exists? CACHE_DIR
108
- # force reinitializing cache dirs
109
- Rack::Cache::Storage.instance.clear
110
-
111
- request_count = 0
112
- response = lambda { |env|
113
- [200, { 'Content-Type' => 'text/plain',
114
- 'Cache-Control' => 'public, max-age=900',
115
- },
116
- "request:#{request_count+=1}"]
117
- }
118
-
119
- @conn = Faraday.new do |b|
120
- b.use RackErrorsComplainer
121
-
122
- b.use FaradayMiddleware::RackCompatible, Rack::Cache::Context,
123
- :metastore => "file:#{CACHE_DIR}/rack/meta",
124
- :entitystore => "file:#{CACHE_DIR}/rack/body",
125
- :verbose => true
126
-
127
- b.adapter :test do |stub|
128
- stub.get('/', &response)
129
- stub.post('/', &response)
130
- end
131
- end
132
- end
133
-
134
- extend Forwardable
135
- def_delegators :@conn, :get, :post
136
-
137
- it 'caches get requests' do
138
- response = get('/', :user_agent => 'test')
139
- expect(response.body).to eq('request:1')
140
- expect(response.env[:method]).to eq(:get)
141
- expect(response.status).to eq(200)
142
-
143
- response = get('/', :user_agent => 'test')
144
- expect(response.body).to eq('request:1')
145
- expect(response['content-type']).to eq('text/plain')
146
- expect(response.env[:method]).to eq(:get)
147
- expect(response.env[:request].respond_to?(:fetch)).to be_true
148
- expect(response.status). to eq(200)
149
-
150
- expect(post('/').body).to eq('request:2')
151
- end
152
-
153
- it 'does not cache post requests' do
154
- expect(get('/').body).to eq('request:1')
155
- expect(post('/').body).to eq('request:2')
156
- expect(post('/').body).to eq('request:3')
157
- end
158
-
159
- # middleware to check whether "rack.errors" is free of error reports
160
- class RackErrorsComplainer < Struct.new(:app)
161
- def call(env)
162
- response = app.call(env)
163
- error_stream = env[:rack_errors]
164
- if error_stream.respond_to?(:string) && error_stream.string.include?('error')
165
- raise %(unexpected error in 'rack.errors': %p) % error_stream.string
166
- end
167
- response
168
- end
169
- end
170
- end