mirror of
https://github.com/lostisland/faraday.git
synced 2025-10-09 00:04:39 -04:00
enable automatic parallel manager detection
This enables the use of `#in_parallel` without manually passing in a parallel manager instance. If the adapter you're using has a parallel manager, it will work as expected. If it doesn't, it'll work as normal sequential requests.
This commit is contained in:
parent
085ee735dc
commit
32ecd07c27
@ -1,5 +1,16 @@
|
|||||||
module Faraday
|
module Faraday
|
||||||
class Adapter < Middleware
|
class Adapter < Middleware
|
||||||
|
class << self
|
||||||
|
attr_accessor :supports_parallel_requests
|
||||||
|
alias supports_parallel_requests? supports_parallel_requests
|
||||||
|
|
||||||
|
# valid parallel managers should respond to #run with no parameters.
|
||||||
|
# otherwise, return a short wrapper around it.
|
||||||
|
def setup_parallel_manager(options = {})
|
||||||
|
nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
CONTENT_LENGTH = 'Content-Length'.freeze
|
CONTENT_LENGTH = 'Content-Length'.freeze
|
||||||
|
|
||||||
extend AutoloadHelper
|
extend AutoloadHelper
|
||||||
|
@ -10,6 +10,8 @@ module Faraday
|
|||||||
require 'fiber'
|
require 'fiber'
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self.supports_parallel_requests = true
|
||||||
|
|
||||||
def self.setup_parallel_manager(options = {})
|
def self.setup_parallel_manager(options = {})
|
||||||
ParallelManager.new
|
ParallelManager.new
|
||||||
end
|
end
|
||||||
|
@ -11,8 +11,8 @@ module Faraday
|
|||||||
METHODS = Set.new [:get, :post, :put, :delete, :head, :patch, :options]
|
METHODS = Set.new [:get, :post, :put, :delete, :head, :patch, :options]
|
||||||
METHODS_WITH_BODIES = Set.new [:post, :put, :patch, :options]
|
METHODS_WITH_BODIES = Set.new [:post, :put, :patch, :options]
|
||||||
|
|
||||||
attr_accessor :parallel_manager
|
attr_reader :params, :headers, :url_prefix, :builder, :options, :ssl, :parallel_manager
|
||||||
attr_reader :params, :headers, :url_prefix, :builder, :options, :ssl
|
attr_writer :default_parallel_manager
|
||||||
|
|
||||||
# :url
|
# :url
|
||||||
# :params
|
# :params
|
||||||
@ -28,7 +28,7 @@ module Faraday
|
|||||||
@params = Utils::ParamsHash.new
|
@params = Utils::ParamsHash.new
|
||||||
@options = options[:request] || {}
|
@options = options[:request] || {}
|
||||||
@ssl = options[:ssl] || {}
|
@ssl = options[:ssl] || {}
|
||||||
@parallel_manager = options[:parallel]
|
@default_parallel_manager = options[:parallel_manager]
|
||||||
|
|
||||||
@builder = options[:builder] || begin
|
@builder = options[:builder] || begin
|
||||||
# pass an empty block to Builder so it doesn't assume default middleware
|
# pass an empty block to Builder so it doesn't assume default middleware
|
||||||
@ -108,12 +108,24 @@ module Faraday
|
|||||||
@builder.insert(0, Faraday::Request::TokenAuthentication, token, options)
|
@builder.insert(0, Faraday::Request::TokenAuthentication, token, options)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def default_parallel_manager
|
||||||
|
return @default_parallel_manager if @default_parallel_manager
|
||||||
|
|
||||||
|
adapter = @builder.handlers.select { |h|
|
||||||
|
h.klass.respond_to?(:setup_parallel_manager)
|
||||||
|
}.first
|
||||||
|
|
||||||
|
if adapter
|
||||||
|
@default_parallel_manager = adapter.klass.setup_parallel_manager
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
def in_parallel?
|
def in_parallel?
|
||||||
!!@parallel_manager
|
!!@parallel_manager
|
||||||
end
|
end
|
||||||
|
|
||||||
def in_parallel(manager)
|
def in_parallel(manager = nil)
|
||||||
@parallel_manager = manager
|
@parallel_manager = manager || default_parallel_manager
|
||||||
yield
|
yield
|
||||||
@parallel_manager && @parallel_manager.run
|
@parallel_manager && @parallel_manager.run
|
||||||
ensure
|
ensure
|
||||||
|
@ -3,15 +3,8 @@ module Faraday
|
|||||||
extend MiddlewareRegistry
|
extend MiddlewareRegistry
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
attr_accessor :load_error, :supports_parallel_requests
|
attr_accessor :load_error
|
||||||
private :load_error=
|
private :load_error=
|
||||||
alias supports_parallel_requests? supports_parallel_requests
|
|
||||||
|
|
||||||
# valid parallel managers should respond to #run with no parameters.
|
|
||||||
# otherwise, return a short wrapper around it.
|
|
||||||
def setup_parallel_manager(options = {})
|
|
||||||
nil
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
self.load_error = nil
|
self.load_error = nil
|
||||||
|
@ -159,7 +159,7 @@ else
|
|||||||
connection = create_connection(adapter)
|
connection = create_connection(adapter)
|
||||||
adapter = real_adapter_for(adapter)
|
adapter = real_adapter_for(adapter)
|
||||||
|
|
||||||
connection.in_parallel(adapter.setup_parallel_manager) do
|
connection.in_parallel do
|
||||||
resp1 = connection.get('json')
|
resp1 = connection.get('json')
|
||||||
resp2 = connection.get('json')
|
resp2 = connection.get('json')
|
||||||
if adapter.supports_parallel_requests?
|
if adapter.supports_parallel_requests?
|
||||||
|
Loading…
x
Reference in New Issue
Block a user