class Faraday::RackBuilder
A Builder that processes requests into responses by passing through an inner middleware stack (heavily inspired by Rack).
@example
Faraday::Connection.new(url: 'http://httpbingo.org') do |builder| builder.request :url_encoded # Faraday::Request::UrlEncoded builder.adapter :net_http # Faraday::Adapter::NetHttp end
Constants
- LOCK_ERR
- MISSING_ADAPTER_ERROR
- NO_ARGUMENT
-
Used to detect missing arguments
Attributes
Public Class Methods
# File lib/faraday/rack_builder.rb, line 61 def initialize(&block) @adapter = nil @handlers = [] build(&block) end
Public Instance Methods
# File lib/faraday/rack_builder.rb, line 179 def ==(other) other.is_a?(self.class) && @handlers == other.handlers && @adapter == other.adapter end
# File lib/faraday/rack_builder.rb, line 79 def [](idx) @handlers[idx] end
# File lib/faraday/rack_builder.rb, line 110 def adapter(klass = NO_ARGUMENT, *args, **kwargs, &block) return @adapter if klass == NO_ARGUMENT || klass.nil? klass = Faraday::Adapter.lookup_middleware(klass) if klass.is_a?(Symbol) @adapter = self.class::Handler.new(klass, *args, **kwargs, &block) end
The “rack app” wrapped in middleware. All requests are sent here.
The builder is responsible for creating the app object. After this, the builder gets locked to ensure no further modifications are made to the middleware stack.
Returns an object that responds to ‘call` and returns a Response
.
# File lib/faraday/rack_builder.rb, line 163 def app @app ||= begin lock! ensure_adapter! to_app end end
# File lib/faraday/rack_builder.rb, line 73 def build raise_if_locked block_given? ? yield(self) : request(:url_encoded) adapter(Faraday.default_adapter, **Faraday.default_adapter_options) unless @adapter end
ENV Keys :http_method - a symbolized request HTTP method (:get, :post) :body - the request body that will eventually be converted to a string. :url - URI instance for the current request. :status - HTTP response status code :request_headers - hash of HTTP Headers to be sent to the server :response_headers - Hash of HTTP headers from the server :parallel_manager - sent if the connection is in parallel mode :request - Hash of options for configuring the request.
:timeout - open/read timeout Integer in seconds :open_timeout - read timeout Integer in seconds :proxy - Hash of proxy options :uri - Proxy Server URI :user - Proxy server username :password - Proxy server password
:ssl - Hash of options for configuring SSL requests.
# File lib/faraday/rack_builder.rb, line 201 def build_env(connection, request) exclusive_url = connection.build_exclusive_url( request.path, request.params, request.options.params_encoder ) Env.new(request.http_method, request.body, exclusive_url, request.options, request.headers, connection.ssl, connection.parallel_manager) end
Processes a Request
into a Response
by passing it through this Builder’s middleware stack.
@param connection [Faraday::Connection] @param request [Faraday::Request]
@return [Faraday::Response]
# File lib/faraday/rack_builder.rb, line 152 def build_response(connection, request) app.call(build_env(connection, request)) end
# File lib/faraday/rack_builder.rb, line 140 def delete(handler) raise_if_locked @handlers.delete(handler) end
# File lib/faraday/rack_builder.rb, line 67 def initialize_dup(original) super @adapter = original.adapter @handlers = original.handlers.dup end
methods to push onto the various positions in the stack:
# File lib/faraday/rack_builder.rb, line 119 def insert(index, ...) raise_if_locked index = assert_index(index) handler = self.class::Handler.new(...) @handlers.insert(index, handler) end
# File lib/faraday/rack_builder.rb, line 128 def insert_after(index, ...) index = assert_index(index) insert(index + 1, ...) end
Locks the middleware stack to ensure no further modifications are made.
# File lib/faraday/rack_builder.rb, line 84 def lock! @handlers.freeze end
# File lib/faraday/rack_builder.rb, line 88 def locked? @handlers.frozen? end
# File lib/faraday/rack_builder.rb, line 102 def request(key, ...) use_symbol(Faraday::Request, key, ...) end
# File lib/faraday/rack_builder.rb, line 106 def response(...) use_symbol(Faraday::Response, ...) end
# File lib/faraday/rack_builder.rb, line 133 def swap(index, ...) raise_if_locked index = assert_index(index) @handlers.delete_at(index) insert(index, ...) end
# File lib/faraday/rack_builder.rb, line 171 def to_app # last added handler is the deepest and thus closest to the inner app # adapter is always the last one @handlers.reverse.inject(@adapter.build) do |app, handler| handler.build(app) end end
# File lib/faraday/rack_builder.rb, line 92 def use(klass, ...) if klass.is_a? Symbol use_symbol(Faraday::Middleware, klass, ...) else raise_if_locked raise_if_adapter(klass) @handlers << self.class::Handler.new(klass, ...) end end