faraday_middleware 0.10.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'forwardable'
3
- # fixes normalizing query strings:
4
- require 'faraday_middleware/addressable_patch' if defined? ::Addressable::URI
5
+ require 'digest/sha1'
5
6
 
6
7
  module FaradayMiddleware
7
8
  # Public: Caches GET responses and pulls subsequent ones from the cache.
8
9
  class Caching < Faraday::Middleware
9
10
  attr_reader :cache
11
+
10
12
  # Internal: List of status codes that can be cached:
11
13
  # * 200 - 'OK'
12
14
  # * 203 - 'Non-Authoritative Information'
@@ -15,41 +17,49 @@ module FaradayMiddleware
15
17
  # * 302 - 'Found'
16
18
  # * 404 - 'Not Found'
17
19
  # * 410 - 'Gone'
18
- CACHEABLE_STATUS_CODES = [200, 203, 300, 301, 302, 404, 410]
20
+ CACHEABLE_STATUS_CODES = [200, 203, 300, 301, 302, 404, 410].freeze
19
21
 
20
22
  extend Forwardable
21
23
  def_delegators :'Faraday::Utils', :parse_query, :build_query
22
24
 
23
25
  # Public: initialize the middleware.
24
26
  #
25
- # cache - An object that responds to read, write and fetch (default: nil).
27
+ # cache - An object that responds to read and write (default: nil).
26
28
  # options - An options Hash (default: {}):
27
- # :ignore_params - String name or Array names of query params
28
- # that should be ignored when forming the cache
29
- # key (default: []).
29
+ # :ignore_params - String name or Array names of query
30
+ # params that should be ignored when forming
31
+ # the cache key (default: []).
32
+ # :write_options - Hash of settings that should be passed as the
33
+ # third options parameter to the cache's #write
34
+ # method. If not specified, no options parameter
35
+ # will be passed.
36
+ # :full_key - Boolean - use full URL as cache key:
37
+ # (url.host + url.request_uri)
38
+ # :status_codes - Array of http status code to be cache
39
+ # (default: CACHEABLE_STATUS_CODE)
30
40
  #
31
41
  # Yields if no cache is given. The block should return a cache object.
32
42
  def initialize(app, cache = nil, options = {})
33
43
  super(app)
34
- options, cache = cache, nil if cache.is_a? Hash and block_given?
44
+ if cache.is_a?(Hash) && block_given?
45
+ options = cache
46
+ cache = nil
47
+ end
35
48
  @cache = cache || yield
36
49
  @options = options
37
50
  end
38
51
 
39
52
  def call(env)
40
- if :get == env[:method]
53
+ if env[:method] == :get
41
54
  if env[:parallel_manager]
42
55
  # callback mode
43
56
  cache_on_complete(env)
44
57
  else
45
58
  # synchronous mode
46
59
  key = cache_key(env)
47
- unless response = cache.read(key) and response
60
+ unless (response = cache.read(key)) && response
48
61
  response = @app.call(env)
49
-
50
- if CACHEABLE_STATUS_CODES.include?(response.status)
51
- cache.write(key, response)
52
- end
62
+ store_response_in_cache(key, response)
53
63
  end
54
64
  finalize_response(response, env)
55
65
  end
@@ -62,29 +72,53 @@ module FaradayMiddleware
62
72
  url = env[:url].dup
63
73
  if url.query && params_to_ignore.any?
64
74
  params = parse_query url.query
65
- params.reject! {|k,| params_to_ignore.include? k }
75
+ params.reject! { |k,| params_to_ignore.include? k }
66
76
  url.query = params.any? ? build_query(params) : nil
67
77
  end
68
78
  url.normalize!
69
- url.request_uri
79
+ digest = full_key? ? url.host + url.request_uri : url.request_uri
80
+ Digest::SHA1.hexdigest(digest)
70
81
  end
71
82
 
72
83
  def params_to_ignore
73
- @params_to_ignore ||= Array(@options[:ignore_params]).map { |p| p.to_s }
84
+ @params_to_ignore ||= Array(@options[:ignore_params]).map(&:to_s)
85
+ end
86
+
87
+ def full_key?
88
+ @full_key ||= @options[:full_key]
89
+ end
90
+
91
+ def custom_status_codes
92
+ @custom_status_codes ||= begin
93
+ codes = CACHEABLE_STATUS_CODES & Array(@options[:status_codes]).map(&:to_i)
94
+ codes.any? ? codes : CACHEABLE_STATUS_CODES
95
+ end
74
96
  end
75
97
 
76
98
  def cache_on_complete(env)
77
99
  key = cache_key(env)
78
- if cached_response = cache.read(key)
100
+ if (cached_response = cache.read(key))
79
101
  finalize_response(cached_response, env)
80
102
  else
81
- response = @app.call(env)
82
- if CACHEABLE_STATUS_CODES.include?(response.status)
83
- response.on_complete { cache.write(key, response) }
103
+ # response.status is nil at this point
104
+ # any checks need to be done inside on_complete block
105
+ @app.call(env).on_complete do |response_env|
106
+ store_response_in_cache(key, response_env.response)
107
+ response_env
84
108
  end
85
109
  end
86
110
  end
87
111
 
112
+ def store_response_in_cache(key, response)
113
+ return unless custom_status_codes.include?(response.status)
114
+
115
+ if @options[:write_options]
116
+ cache.write(key, response, @options[:write_options])
117
+ else
118
+ cache.write(key, response)
119
+ end
120
+ end
121
+
88
122
  def finalize_response(response, env)
89
123
  response = response.dup if response.frozen?
90
124
  env[:response] = response
@@ -1,16 +1,19 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response_middleware'
2
4
 
3
5
  module FaradayMiddleware
4
- # Public: Parse a Transfer-Encoding: Chunked response to just the original data
6
+ # Public: Parse a Transfer-Encoding. Chunks response to just the original data
5
7
  class Chunked < FaradayMiddleware::ResponseMiddleware
6
- TRANSFER_ENCODING = 'transfer-encoding'.freeze
8
+ TRANSFER_ENCODING = 'transfer-encoding'
7
9
 
8
10
  define_parser do |raw_body|
9
11
  decoded_body = []
10
12
  until raw_body.empty?
11
13
  chunk_len, raw_body = raw_body.split("\r\n", 2)
12
- chunk_len = chunk_len.split(';',2).first.hex
13
- break if chunk_len == 0
14
+ chunk_len = chunk_len.split(';', 2).first.hex
15
+ break if chunk_len.zero?
16
+
14
17
  decoded_body << raw_body[0, chunk_len]
15
18
  # The 2 is to strip the extra CRLF at the end of the chunk
16
19
  raw_body = raw_body[chunk_len + 2, raw_body.length - chunk_len - 2]
@@ -19,11 +22,12 @@ module FaradayMiddleware
19
22
  end
20
23
 
21
24
  def parse_response?(env)
22
- super and chunked_encoding?(env[:response_headers])
25
+ super && chunked_encoding?(env[:response_headers])
23
26
  end
24
27
 
25
28
  def chunked_encoding?(headers)
26
- encoding = headers[TRANSFER_ENCODING] and encoding.split(',').include?('chunked')
29
+ (encoding = headers[TRANSFER_ENCODING]) &&
30
+ encoding.split(',').include?('chunked')
27
31
  end
28
32
  end
29
33
  end
@@ -1,18 +1,10 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
  require 'set'
3
5
 
4
6
  module FaradayMiddleware
5
- # Public: Exception thrown when the maximum amount of requests is exceeded.
6
- class RedirectLimitReached < Faraday::Error::ClientError
7
- attr_reader :response
8
-
9
- def initialize(response)
10
- super "too many redirects; last one to: #{response['location']}"
11
- @response = response
12
- end
13
- end
14
-
15
- # Public: Follow HTTP 301, 302, 303, and 307 redirects.
7
+ # Public: Follow HTTP 301, 302, 303, 307, and 308 redirects.
16
8
  #
17
9
  # For HTTP 301, 302, and 303, the original GET, POST, PUT, DELETE, or PATCH
18
10
  # request gets converted into a GET. With `:standards_compliant => true`,
@@ -32,26 +24,37 @@ module FaradayMiddleware
32
24
  # end
33
25
  class FollowRedirects < Faraday::Middleware
34
26
  # HTTP methods for which 30x redirects can be followed
35
- ALLOWED_METHODS = Set.new [:head, :options, :get, :post, :put, :patch, :delete]
27
+ ALLOWED_METHODS = Set.new %i[head options get post put patch delete]
36
28
  # HTTP redirect status codes that this middleware implements
37
- REDIRECT_CODES = Set.new [301, 302, 303, 307]
29
+ REDIRECT_CODES = Set.new [301, 302, 303, 307, 308]
38
30
  # Keys in env hash which will get cleared between requests
39
- ENV_TO_CLEAR = Set.new [:status, :response, :response_headers]
31
+ ENV_TO_CLEAR = Set.new %i[status response response_headers]
40
32
 
41
33
  # Default value for max redirects followed
42
34
  FOLLOW_LIMIT = 3
43
35
 
44
36
  # Regex that matches characters that need to be escaped in URLs, sans
45
37
  # the "%" character which we assume already represents an escaped sequence.
46
- URI_UNSAFE = /[^\-_.!~*'()a-zA-Z\d;\/?:@&=+$,\[\]%]/
38
+ URI_UNSAFE = %r{[^\-_.!~*'()a-zA-Z\d;/?:@&=+$,\[\]%]}.freeze
39
+
40
+ AUTH_HEADER = 'Authorization'
47
41
 
48
42
  # Public: Initialize the middleware.
49
43
  #
50
44
  # options - An options Hash (default: {}):
51
- # :limit - A Numeric redirect limit (default: 3)
52
- # :standards_compliant - A Boolean indicating whether to respect
45
+ # :limit - A Numeric redirect limit (default: 3)
46
+ # :standards_compliant - A Boolean indicating whether to respect
53
47
  # the HTTP spec when following 301/302
54
48
  # (default: false)
49
+ # :callback - A callable used on redirects
50
+ # with the old and new envs
51
+ # :cookies - An Array of Strings (e.g.
52
+ # ['cookie1', 'cookie2']) to choose
53
+ # cookies to be kept, or :all to keep
54
+ # all cookies (default: []).
55
+ # :clear_authorization_header - A Boolean indicating whether the request
56
+ # Authorization header should be cleared on
57
+ # redirects (default: true)
55
58
  def initialize(app, options = {})
56
59
  super(app)
57
60
  @options = options
@@ -67,7 +70,7 @@ module FaradayMiddleware
67
70
  private
68
71
 
69
72
  def convert_to_get?(response)
70
- ![:head, :options].include?(response.env[:method]) &&
73
+ !%i[head options].include?(response.env[:method]) &&
71
74
  @convert_to_get.include?(response.status)
72
75
  end
73
76
 
@@ -78,7 +81,9 @@ module FaradayMiddleware
78
81
  response.on_complete do |response_env|
79
82
  if follow_redirect?(response_env, response)
80
83
  raise RedirectLimitReached, response if follows.zero?
81
- new_request_env = update_env(response_env, request_body, response)
84
+
85
+ new_request_env = update_env(response_env.dup, request_body, response)
86
+ callback&.call(response_env, new_request_env)
82
87
  response = perform_with_redirection(new_request_env, follows - 1)
83
88
  end
84
89
  end
@@ -86,7 +91,11 @@ module FaradayMiddleware
86
91
  end
87
92
 
88
93
  def update_env(env, request_body, response)
89
- env[:url] += safe_escape(response['location'])
94
+ redirect_from_url = env[:url].to_s
95
+ redirect_to_url = safe_escape(response['location'] || '')
96
+ env[:url] += redirect_to_url
97
+
98
+ ENV_TO_CLEAR.each { |key| env.delete key }
90
99
 
91
100
  if convert_to_get?(response)
92
101
  env[:method] = :get
@@ -95,14 +104,14 @@ module FaradayMiddleware
95
104
  env[:body] = request_body
96
105
  end
97
106
 
98
- ENV_TO_CLEAR.each {|key| env.delete key }
107
+ clear_authorization_header(env, redirect_from_url, redirect_to_url)
99
108
 
100
109
  env
101
110
  end
102
111
 
103
112
  def follow_redirect?(env, response)
104
- ALLOWED_METHODS.include? env[:method] and
105
- REDIRECT_CODES.include? response.status
113
+ ALLOWED_METHODS.include?(env[:method]) &&
114
+ REDIRECT_CODES.include?(response.status)
106
115
  end
107
116
 
108
117
  def follow_limit
@@ -113,14 +122,36 @@ module FaradayMiddleware
113
122
  @options.fetch(:standards_compliant, false)
114
123
  end
115
124
 
125
+ def callback
126
+ @options[:callback]
127
+ end
128
+
116
129
  # Internal: escapes unsafe characters from an URL which might be a path
117
130
  # component only or a fully qualified URI so that it can be joined onto an
118
131
  # URI:HTTP using the `+` operator. Doesn't escape "%" characters so to not
119
132
  # risk double-escaping.
120
133
  def safe_escape(uri)
121
- uri.to_s.gsub(URI_UNSAFE) { |match|
122
- '%' + match.unpack('H2' * match.bytesize).join('%').upcase
123
- }
134
+ uri = uri.split('#')[0] # we want to remove the fragment if present
135
+ uri.to_s.gsub(URI_UNSAFE) do |match|
136
+ "%#{match.unpack('H2' * match.bytesize).join('%').upcase}"
137
+ end
138
+ end
139
+
140
+ def clear_authorization_header(env, from_url, to_url)
141
+ return env if redirect_to_same_host?(from_url, to_url)
142
+ return env unless @options.fetch(:clear_authorization_header, true)
143
+
144
+ env[:request_headers].delete(AUTH_HEADER)
145
+ end
146
+
147
+ def redirect_to_same_host?(from_url, to_url)
148
+ return true if to_url.start_with?('/')
149
+
150
+ from_uri = URI.parse(from_url)
151
+ to_uri = URI.parse(to_url)
152
+
153
+ [from_uri.scheme, from_uri.host, from_uri.port] ==
154
+ [to_uri.scheme, to_uri.host, to_uri.port]
124
155
  end
125
156
  end
126
157
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday'
2
4
 
3
5
  module FaradayMiddleware
@@ -1,10 +1,13 @@
1
- require "time"
2
- require "faraday"
1
+ # frozen_string_literal: true
2
+
3
+ require 'time'
4
+ require 'faraday'
3
5
 
4
6
  module FaradayMiddleware
5
7
  # Parse dates from response body
6
8
  class ParseDates < ::Faraday::Response::Middleware
7
- ISO_DATE_FORMAT = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?Z\Z/m
9
+ ISO_DATE_FORMAT = /\A\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?
10
+ (Z|((\+|-)\d{2}:?\d{2}))\Z/xm.freeze
8
11
 
9
12
  def initialize(app, options = {})
10
13
  @regexp = options[:match] || ISO_DATE_FORMAT
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response_middleware'
2
4
 
3
5
  module FaradayMiddleware
@@ -7,8 +9,8 @@ module FaradayMiddleware
7
9
  require 'json' unless defined?(::JSON)
8
10
  end
9
11
 
10
- define_parser do |body|
11
- ::JSON.parse body unless body.strip.empty?
12
+ define_parser do |body, parser_options|
13
+ ::JSON.parse(body, parser_options || {}) unless body.strip.empty?
12
14
  end
13
15
 
14
16
  # Public: Override the content-type of the response with "application/json"
@@ -18,7 +20,7 @@ module FaradayMiddleware
18
20
  # This is to fix responses from certain API providers that insist on serving
19
21
  # JSON with wrong MIME-types such as "text/javascript".
20
22
  class MimeTypeFix < ResponseMiddleware
21
- MIME_TYPE = 'application/json'.freeze
23
+ MIME_TYPE = 'application/json'
22
24
 
23
25
  def process_response(env)
24
26
  old_type = env[:response_headers][CONTENT_TYPE].to_s
@@ -27,19 +29,17 @@ module FaradayMiddleware
27
29
  env[:response_headers][CONTENT_TYPE] = new_type
28
30
  end
29
31
 
30
- BRACKETS = %w- [ { -
31
- WHITESPACE = [ " ", "\n", "\r", "\t" ]
32
+ BRACKETS = %w-[ {-.freeze
33
+ WHITESPACE = [' ', "\n", "\r", "\t"].freeze
32
34
 
33
35
  def parse_response?(env)
34
- super and BRACKETS.include? first_char(env[:body])
36
+ super && BRACKETS.include?(first_char(env[:body]))
35
37
  end
36
38
 
37
39
  def first_char(body)
38
40
  idx = -1
39
- begin
40
- char = body[idx += 1]
41
- char = char.chr if char
42
- end while char and WHITESPACE.include? char
41
+ char = body[idx += 1]
42
+ char = body[idx += 1] while char && WHITESPACE.include?(char)
43
43
  char
44
44
  end
45
45
  end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response_middleware'
2
4
 
3
5
  module FaradayMiddleware
4
6
  # Public: Restore marshalled Ruby objects in response bodies.
5
7
  class ParseMarshal < ResponseMiddleware
6
8
  define_parser do |body|
7
- ::Marshal.load body unless body.empty?
9
+ ::Marshal.load(body) unless body.empty?
8
10
  end
9
11
  end
10
12
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response_middleware'
2
4
 
3
5
  module FaradayMiddleware
@@ -5,8 +7,8 @@ module FaradayMiddleware
5
7
  class ParseXml < ResponseMiddleware
6
8
  dependency 'multi_xml'
7
9
 
8
- define_parser do |body|
9
- ::MultiXml.parse(body)
10
+ define_parser do |body, parser_options|
11
+ ::MultiXml.parse(body, parser_options || {})
10
12
  end
11
13
  end
12
14
  end
@@ -1,29 +1,36 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response_middleware'
2
4
 
3
5
  module FaradayMiddleware
4
6
  # Public: Parse response bodies as YAML.
5
7
  #
6
- # Warning: this uses `YAML.load()` by default and as such is not safe against
7
- # code injection or DoS attacks. If you're loading resources from an
8
- # untrusted host or over HTTP, you should subclass this middleware and
9
- # redefine it to use `safe_load()` if you're using a Psych version that
10
- # supports it:
8
+ # Warning: This is not backwards compatible with versions of this middleware
9
+ # prior to faraday_middleware v0.12 - prior to this version, we used
10
+ # YAML.load rather than YAMl.safe_load, which exposes serious remote code
11
+ # execution risks - see https://github.com/ruby/psych/issues/119 for details.
12
+ # If you're sure you can trust YAML you're passing, you can set up an unsafe
13
+ # version of this middleware like this:
14
+ #
15
+ # class UnsafelyParseYaml < FaradayMiddleware::ResponseMiddleware
16
+ # dependency do
17
+ # require 'yaml'
18
+ # end
11
19
  #
12
- # class SafeYaml < FaradayMiddleware::ParseYaml
13
20
  # define_parser do |body|
14
- # YAML.safe_load(body)
21
+ # YAML.load body
15
22
  # end
16
23
  # end
17
24
  #
18
25
  # Faraday.new(..) do |config|
19
- # config.use SafeYaml
26
+ # config.use UnsafelyParseYaml
20
27
  # ...
21
28
  # end
22
29
  class ParseYaml < ResponseMiddleware
23
- dependency 'yaml'
30
+ dependency 'safe_yaml/load'
24
31
 
25
- define_parser do |body|
26
- ::YAML.load body
32
+ define_parser do |body, parser_options|
33
+ SafeYAML.load(body, nil, parser_options || {})
27
34
  end
28
35
  end
29
36
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'faraday_middleware/response/mashify'
2
4
 
3
5
  module FaradayMiddleware
@@ -6,7 +8,7 @@ module FaradayMiddleware
6
8
  class Rashify < Mashify
7
9
  dependency do
8
10
  require 'rash'
9
- self.mash_class = ::Hashie::Rash
11
+ self.mash_class = ::Hashie::Mash::Rash
10
12
  end
11
13
  end
12
14
  end
@@ -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.10.0" unless defined?(FaradayMiddleware::VERSION)
5
+ VERSION = '1.2.0' unless defined?(FaradayMiddleware::VERSION)
3
6
  end