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
Calls superclass method
# 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
Also aliased as: insert_before
# 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