From 1621e27d01eaa4d6814496a59b24c252a7cbe11f Mon Sep 17 00:00:00 2001 From: Yohei Kitamura Date: Thu, 14 Jul 2022 15:22:17 -0400 Subject: [PATCH] [Ruby] Enhance Faraday middleware support --- .../ruby-client/configuration.mustache | 49 ++++++++++++++----- .../lib/petstore/configuration.rb | 49 ++++++++++++++----- 2 files changed, 72 insertions(+), 26 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/ruby-client/configuration.mustache b/modules/openapi-generator/src/main/resources/ruby-client/configuration.mustache index 46319a3cdb9a..8f7856537ba9 100644 --- a/modules/openapi-generator/src/main/resources/ruby-client/configuration.mustache +++ b/modules/openapi-generator/src/main/resources/ruby-client/configuration.mustache @@ -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) - end + return if @middlewares.empty? + + [:request, :response, :use, :insert, :insert_before, :insert_after, :swap].each do |operation| + next unless @middlewares.key?(operation) - @request_middlewares.each do |middleware| - connection.request(*middleware) + @middlewares[operation].each do |key, args, block| + connection.builder.send(operation, key, *args, &block) + end 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}} diff --git a/samples/client/petstore/ruby-faraday/lib/petstore/configuration.rb b/samples/client/petstore/ruby-faraday/lib/petstore/configuration.rb index 964802a3814f..a84ea63b3e91 100644 --- a/samples/client/petstore/ruby-faraday/lib/petstore/configuration.rb +++ b/samples/client/petstore/ruby-faraday/lib/petstore/configuration.rb @@ -153,9 +153,7 @@ def initialize @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 @@ def server_url(index, variables = {}, servers = nil) # 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) - end + return if @middlewares.empty? + + [:request, :response, :use, :insert, :insert_before, :insert_after, :swap].each do |operation| + next unless @middlewares.key?(operation) - @request_middlewares.each do |middleware| - connection.request(*middleware) + @middlewares[operation].each do |key, args, block| + connection.builder.send(operation, key, *args, &block) + end 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