[Ruby] Enhance Faraday middleware support (#12873)

This commit is contained in:
Yohei Kitamura
2022-07-20 23:01:14 -04:00
committed by GitHub
parent 33ec914e6a
commit 9b154bb437
2 changed files with 74 additions and 28 deletions

View File

@@ -111,9 +111,7 @@ module {{moduleName}}
@ssl_ca_file = nil
@ssl_client_cert = nil
@ssl_client_key = nil
@middlewares = []
@request_middlewares = []
@response_middlewares = []
@middlewares = Hash.new { |h, k| h[k] = [] }
@timeout = 60
# return data as binary instead of file
@return_binary_data = false
@@ -350,31 +348,56 @@ module {{moduleName}}
{{#isFaraday}}
# Adds middleware to the stack
def use(*middleware)
@middlewares << middleware
set_faraday_middleware(:use, *middleware)
end
# Adds request middleware to the stack
def request(*middleware)
@request_middlewares << middleware
set_faraday_middleware(:request, *middleware)
end
# Adds response middleware to the stack
def response(*middleware)
@response_middlewares << middleware
set_faraday_middleware(:response, *middleware)
end
# Adds Faraday middleware setting information to the stack
#
# @example Use the `set_faraday_middleware` method to set middleware information
# config.set_faraday_middleware(:request, :retry, max: 3, methods: [:get, :post], retry_statuses: [503])
# config.set_faraday_middleware(:response, :logger, nil, { bodies: true, log_level: :debug })
# config.set_faraday_middleware(:use, Faraday::HttpCache, store: Rails.cache, shared_cache: false)
# config.set_faraday_middleware(:insert, 0, FaradayMiddleware::FollowRedirects, { standards_compliant: true, limit: 1 })
# config.set_faraday_middleware(:swap, 0, Faraday::Response::Logger)
# config.set_faraday_middleware(:delete, Faraday::Multipart::Middleware)
#
# @see https://github.com/lostisland/faraday/blob/v2.3.0/lib/faraday/rack_builder.rb#L92-L143
def set_faraday_middleware(operation, key, *args, &block)
unless [:request, :response, :use, :insert, :insert_before, :insert_after, :swap, :delete].include?(operation)
fail ArgumentError, "Invalid faraday middleware operation #{operation}. Must be" \
" :request, :response, :use, :insert, :insert_before, :insert_after, :swap or :delete."
end
@middlewares[operation] << [key, args, block]
end
ruby2_keywords(:set_faraday_middleware) if respond_to?(:ruby2_keywords, true)
# Set up middleware on the connection
def configure_middleware(connection)
@middlewares.each do |middleware|
connection.use(*middleware)
return if @middlewares.empty?
[:request, :response, :use, :insert, :insert_before, :insert_after, :swap].each do |operation|
next unless @middlewares.key?(operation)
@middlewares[operation].each do |key, args, block|
connection.builder.send(operation, key, *args, &block)
end
end
@request_middlewares.each do |middleware|
connection.request(*middleware)
end
@response_middlewares.each do |middleware|
connection.response(*middleware)
if @middlewares.key?(:delete)
@middlewares[:delete].each do |key, _args, _block|
connection.builder.delete(key)
end
end
end
{{/isFaraday}}

View File

@@ -153,9 +153,7 @@ module Petstore
@ssl_ca_file = nil
@ssl_client_cert = nil
@ssl_client_key = nil
@middlewares = []
@request_middlewares = []
@response_middlewares = []
@middlewares = Hash.new { |h, k| h[k] = [] }
@timeout = 60
# return data as binary instead of file
@return_binary_data = false
@@ -368,31 +366,56 @@ module Petstore
# Adds middleware to the stack
def use(*middleware)
@middlewares << middleware
set_faraday_middleware(:use, *middleware)
end
# Adds request middleware to the stack
def request(*middleware)
@request_middlewares << middleware
set_faraday_middleware(:request, *middleware)
end
# Adds response middleware to the stack
def response(*middleware)
@response_middlewares << middleware
set_faraday_middleware(:response, *middleware)
end
# Adds Faraday middleware setting information to the stack
#
# @example Use the `set_faraday_middleware` method to set middleware information
# config.set_faraday_middleware(:request, :retry, max: 3, methods: [:get, :post], retry_statuses: [503])
# config.set_faraday_middleware(:response, :logger, nil, { bodies: true, log_level: :debug })
# config.set_faraday_middleware(:use, Faraday::HttpCache, store: Rails.cache, shared_cache: false)
# config.set_faraday_middleware(:insert, 0, FaradayMiddleware::FollowRedirects, { standards_compliant: true, limit: 1 })
# config.set_faraday_middleware(:swap, 0, Faraday::Response::Logger)
# config.set_faraday_middleware(:delete, Faraday::Multipart::Middleware)
#
# @see https://github.com/lostisland/faraday/blob/v2.3.0/lib/faraday/rack_builder.rb#L92-L143
def set_faraday_middleware(operation, key, *args, &block)
unless [:request, :response, :use, :insert, :insert_before, :insert_after, :swap, :delete].include?(operation)
fail ArgumentError, "Invalid faraday middleware operation #{operation}. Must be" \
" :request, :response, :use, :insert, :insert_before, :insert_after, :swap or :delete."
end
@middlewares[operation] << [key, args, block]
end
ruby2_keywords(:set_faraday_middleware) if respond_to?(:ruby2_keywords, true)
# Set up middleware on the connection
def configure_middleware(connection)
@middlewares.each do |middleware|
connection.use(*middleware)
return if @middlewares.empty?
[:request, :response, :use, :insert, :insert_before, :insert_after, :swap].each do |operation|
next unless @middlewares.key?(operation)
@middlewares[operation].each do |key, args, block|
connection.builder.send(operation, key, *args, &block)
end
end
@request_middlewares.each do |middleware|
connection.request(*middleware)
end
@response_middlewares.each do |middleware|
connection.response(*middleware)
if @middlewares.key?(:delete)
@middlewares[:delete].each do |key, _args, _block|
connection.builder.delete(key)
end
end
end
end