Class: Faraday::Connection

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/faraday/connection.rb

Overview

Connection objects manage the default properties and the middleware stack for fulfilling an HTTP request.

Examples:


conn = Faraday::Connection.new 'http://httpbingo.org'

# GET http://httpbingo.org/nigiri
conn.get 'nigiri'
# => #<Faraday::Response>

Constant Summary collapse

METHODS =

A Set of allowed HTTP verbs.

Set.new %i[get post put delete head patch options trace]
USER_AGENT =
"Faraday v#{VERSION}".freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(url = nil, options = nil) {|self| ... } ⇒ Connection

Initializes a new Faraday::Connection.

Parameters:

  • url (URI, String) (defaults to: nil)

    URI or String base URL to use as a prefix for all requests (optional).

  • options (Hash, Faraday::ConnectionOptions) (defaults to: nil)

Options Hash (options):

  • :url (URI, String) — default: 'http:/'

    URI or String base URL

  • :params (Hash<String => String>)

    URI query unencoded key/value pairs.

  • :headers (Hash<String => String>)

    Hash of unencoded HTTP header key/value pairs.

  • :request (Hash)

    Hash of request options.

  • :ssl (Hash)

    Hash of SSL options.

  • :proxy (Hash, URI, String)

    proxy options, either as a URL or as a Hash

  • :proxy[:uri] (URI, String)
  • :proxy[:user] (String)
  • :proxy[:password] (String)

Yields:

  • (self)

    after all setup has been done



63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/faraday/connection.rb', line 63

def initialize(url = nil, options = nil)
  options = ConnectionOptions.from(options)

  if url.is_a?(Hash) || url.is_a?(ConnectionOptions)
    options = Utils.deep_merge(options, url)
    url     = options.url
  end

  @parallel_manager = nil
  @headers = Utils::Headers.new
  @params  = Utils::ParamsHash.new
  @options = options.request
  @ssl = options.ssl
  @default_parallel_manager = options.parallel_manager
  @manual_proxy = nil

  @builder = options.builder || begin
    # pass an empty block to Builder so it doesn't assume default middleware
    options.new_builder(block_given? ? proc { |b| } : nil)
  end

  self.url_prefix = url || 'http:/'

  @params.update(options.params)   if options.params
  @headers.update(options.headers) if options.headers

  initialize_proxy(url, options)

  yield(self) if block_given?

  @headers[:user_agent] ||= USER_AGENT
end

Instance Attribute Details

#builderFaraday::RackBuilder (readonly)

Returns Builder for this Connection.

Returns:



31
32
33
# File 'lib/faraday/connection.rb', line 31

def builder
  @builder
end

#default_parallel_manager { ... } ⇒ Object?

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Check if the adapter is parallel-capable.

Yields:

  • if the adapter isn’t parallel-capable, or if no adapter is set yet.

Returns:

  • (Object, nil)

    a parallel manager or nil if yielded



291
292
293
294
295
296
297
298
299
300
301
# File 'lib/faraday/connection.rb', line 291

def default_parallel_manager
  @default_parallel_manager ||= begin
    adapter = @builder.adapter.klass if @builder.adapter

    if support_parallel?(adapter)
      adapter.setup_parallel_manager
    elsif block_given?
      yield
    end
  end
end

#headersHash

Returns unencoded HTTP header key/value pairs.

Returns:

  • (Hash)

    unencoded HTTP header key/value pairs.



24
25
26
# File 'lib/faraday/connection.rb', line 24

def headers
  @headers
end

#parallel_managerObject (readonly)

Returns the parallel manager for this Connection.

Returns:

  • (Object)

    the parallel manager for this Connection.



37
38
39
# File 'lib/faraday/connection.rb', line 37

def parallel_manager
  @parallel_manager
end

#paramsHash

Returns URI query unencoded key/value pairs.

Returns:

  • (Hash)

    URI query unencoded key/value pairs.



21
22
23
# File 'lib/faraday/connection.rb', line 21

def params
  @params
end

#proxyHash

Returns proxy options.

Returns:

  • (Hash)

    proxy options.



43
44
45
# File 'lib/faraday/connection.rb', line 43

def proxy
  @proxy
end

#sslHash (readonly)

Returns SSL options.

Returns:

  • (Hash)

    SSL options.



34
35
36
# File 'lib/faraday/connection.rb', line 34

def ssl
  @ssl
end

#url_prefixString

Returns a URI with the prefix used for all requests from this Connection. This includes a default host name, scheme, port, and path.

Returns:

  • (String)

    a URI with the prefix used for all requests from this Connection. This includes a default host name, scheme, port, and path.



28
29
30
# File 'lib/faraday/connection.rb', line 28

def url_prefix
  @url_prefix
end

Class Method Details

.delete(url = nil, params = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a DELETE HTTP request without a body.

Examples:

conn.delete '/items/1'

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • params (Hash, nil) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 166

.get(url = nil, params = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a GET HTTP request without a body.

Examples:

conn.get '/items', { page: 1 }, :accept => 'application/json'

# ElasticSearch example sending a body with GET.
conn.get '/twitter/tweet/_search' do |req|
  req.headers[:content_type] = 'application/json'
  req.params[:routing] = 'kimchy'
  req.body = JSON.generate(query: {...})
end

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • params (Hash, nil) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 129

.head(url = nil, params = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a HEAD HTTP request without a body.

Examples:

conn.head '/items/1'

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • params (Hash, nil) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 151

.post(url = nil, body = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a POST HTTP request with a body.

Examples:

conn.post '/items', data, content_type: 'application/json'

# Simple ElasticSearch indexing sample.
conn.post '/twitter/tweet' do |req|
  req.headers[:content_type] = 'application/json'
  req.params[:routing] = 'kimchy'
  req.body = JSON.generate(user: 'kimchy', ...)
end

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • body (String, nil) (defaults to: nil)

    body for the request.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 232

.put(url = nil, body = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a PUT HTTP request with a body.

Examples:

conn.put '/products/123', data, content_type: 'application/json'

# Star a gist.
conn.put 'https://api.github.com/gists/GIST_ID/star' do |req|
  req.headers['Accept'] = 'application/vnd.github+json'
  req.headers['Authorization'] = 'Bearer <YOUR-TOKEN>'
  req.headers['X-GitHub-Api-Version'] = '2022-11-28'
end

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • body (String, nil) (defaults to: nil)

    body for the request.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 254

.trace(url = nil, params = nil, headers = nil) {|Faraday::Request| ... } ⇒ Faraday::Response

Makes a TRACE HTTP request without a body.

Examples:

conn.connect '/items/1'

Parameters:

  • url (String, URI, nil) (defaults to: nil)

    The optional String base URL to use as a prefix for all requests. Can also be the options Hash.

  • params (Hash, nil) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash, nil) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:



# File 'lib/faraday/connection.rb', line 181

Instance Method Details

#build_exclusive_url(url = nil, params = nil, params_encoder = nil) ⇒ URI

Build an absolute URL based on url_prefix.

of the resulting url (default: nil).

Parameters:

  • url (String, URI, nil) (defaults to: nil)
  • params (Faraday::Utils::ParamsHash) (defaults to: nil)

    A Faraday::Utils::ParamsHash to replace the query values

Returns:

  • (URI)


470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
# File 'lib/faraday/connection.rb', line 470

def build_exclusive_url(url = nil, params = nil, params_encoder = nil)
  url = nil if url.respond_to?(:empty?) && url.empty?
  base = url_prefix.dup
  if url && !base.path.end_with?('/')
    base.path = "#{base.path}/" # ensure trailing slash
  end
  # Ensure relative url will be parsed correctly (such as `service:search` )
  url = "./#{url}" if url.respond_to?(:start_with?) && !url.start_with?('http://', 'https://', '/', './', '../')
  uri = url ? base + url : base
  if params
    uri.query = params.to_query(params_encoder || options.params_encoder)
  end
  uri.query = nil if uri.query && uri.query.empty?
  uri
end

#build_request(method) {|Faraday::Request| ... } ⇒ Faraday::Request

Creates and configures the request object.

Parameters:

  • method (Symbol)

Yields:

Returns:



453
454
455
456
457
458
459
460
# File 'lib/faraday/connection.rb', line 453

def build_request(method)
  Request.create(method) do |req|
    req.params  = params.dup
    req.headers = headers.dup
    req.options = options.dup
    yield(req) if block_given?
  end
end

#build_url(url = nil, extra_params = nil) ⇒ Object

Takes a relative url for a request and combines it with the defaults set on the connection instance.

Examples:

conn = Faraday::Connection.new { ... }
conn.url_prefix = "https://httpbingo.org/api?token=abc"
conn.scheme      # => https
conn.path_prefix # => "/api"

conn.build_url("nigiri?page=2")
# => https://httpbingo.org/api/nigiri?token=abc&page=2

conn.build_url("nigiri", page: 2)
# => https://httpbingo.org/api/nigiri?token=abc&page=2

Parameters:

  • url (String, URI, nil) (defaults to: nil)
  • extra_params (Hash) (defaults to: nil)


407
408
409
410
411
412
413
414
415
416
417
418
419
420
# File 'lib/faraday/connection.rb', line 407

def build_url(url = nil, extra_params = nil)
  uri = build_exclusive_url(url)

  query_values = params.dup.merge_query(uri.query, options.params_encoder)
  query_values.update(extra_params) if extra_params
  uri.query =
    if query_values.empty?
      nil
    else
      query_values.to_query(options.params_encoder)
    end

  uri
end

#closeObject

Closes the underlying resources and/or connections. In the case of persistent connections, this closes all currently open connections but does not prevent new connections from being made.



125
126
127
# File 'lib/faraday/connection.rb', line 125

def close
  app.close
end

#dupFaraday::Connection

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

Creates a duplicate of this Faraday::Connection.

Returns:



491
492
493
494
495
496
497
498
# File 'lib/faraday/connection.rb', line 491

def dup
  self.class.new(build_exclusive_url,
                 headers: headers.dup,
                 params: params.dup,
                 builder: builder.dup,
                 ssl: ssl.dup,
                 request: options.dup)
end

#find_default_proxyObject



534
535
536
537
538
539
540
# File 'lib/faraday/connection.rb', line 534

def find_default_proxy
  uri = ENV.fetch('http_proxy', nil)
  return unless uri && !uri.empty?

  uri = "http://#{uri}" unless uri.match?(/^http/i)
  uri
end

#in_parallel(manager = nil) { ... } ⇒ void

This method returns an undefined value.

Sets up the parallel manager to make a set of requests.

Parameters:

  • manager (Object) (defaults to: nil)

    The parallel manager that this Connection’s Adapter uses.

Yields:

  • a block to execute multiple requests.



317
318
319
320
321
322
323
324
325
326
327
328
# File 'lib/faraday/connection.rb', line 317

def in_parallel(manager = nil)
  @parallel_manager = manager || default_parallel_manager do
    warn 'Warning: `in_parallel` called but no parallel-capable adapter ' \
         'on Faraday stack'
    warn caller[2, 10].join("\n")
    nil
  end
  yield
  @parallel_manager&.run
ensure
  @parallel_manager = nil
end

#in_parallel?Boolean

Determine if this Faraday::Connection can make parallel requests.

Returns:

  • (Boolean)


306
307
308
# File 'lib/faraday/connection.rb', line 306

def in_parallel?
  !!@parallel_manager
end

#initialize_proxy(url, options) ⇒ Object



96
97
98
99
100
101
102
103
104
# File 'lib/faraday/connection.rb', line 96

def initialize_proxy(url, options)
  @manual_proxy = !!options.proxy
  @proxy =
    if options.proxy
      ProxyOptions.from(options.proxy)
    else
      proxy_from_env(url)
    end
end

#optionsFaraday::Response #options(url, params = nil, headers = nil) ⇒ Faraday::Response

Examples:

conn.options '/items/1'

Overloads:

  • #optionsFaraday::Response

    Returns current Connection options.

  • #options(url, params = nil, headers = nil) ⇒ Faraday::Response

    Makes an OPTIONS HTTP request to the given URL.

    Parameters:

    • url (String, URI, nil)

      String base URL to sue as a prefix for all requests.

    • params (Hash, nil) (defaults to: nil)

      Hash of URI query unencoded key/value pairs.

    • headers (Hash, nil) (defaults to: nil)

      unencoded HTTP header key/value pairs.

Yields:

Returns:



222
223
224
225
226
227
228
229
230
# File 'lib/faraday/connection.rb', line 222

def options(*args)
  return @options if args.empty?

  url, params, headers = *args
  run_request(:options, url, nil, headers) do |request|
    request.params.update(params) if params
    yield request if block_given?
  end
end

#path_prefix=(value) ⇒ String

Sets the path prefix and ensures that it always has a leading slash.

Parameters:

  • value (String)

Returns:

  • (String)

    the new path prefix



382
383
384
385
386
387
# File 'lib/faraday/connection.rb', line 382

def path_prefix=(value)
  url_prefix.path = if value
                      value = "/#{value}" unless value[0, 1] == '/'
                      value
                    end
end

#proxy_for_request(url) ⇒ Object



542
543
544
545
546
547
548
549
550
# File 'lib/faraday/connection.rb', line 542

def proxy_for_request(url)
  return proxy if @manual_proxy

  if url && Utils.URI(url).absolute?
    proxy_from_env(url)
  else
    proxy
  end
end

#proxy_from_env(url) ⇒ Object



514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
# File 'lib/faraday/connection.rb', line 514

def proxy_from_env(url)
  return if Faraday.ignore_env_proxy

  uri = nil
  case url
  when String
    uri = Utils.URI(url)
    uri = if uri.host.nil?
            find_default_proxy
          else
            URI.parse("#{uri.scheme}://#{uri.host}").find_proxy
          end
  when URI
    uri = url.find_proxy
  when nil
    uri = find_default_proxy
  end
  ProxyOptions.from(uri) if uri
end

#run_request(method, url, body, headers) ⇒ Faraday::Response

Builds and runs the Faraday::Request.

Parameters:

  • method (Symbol)

    HTTP method.

  • url (String, URI, nil)

    String or URI to access.

  • body (String, Hash, Array, nil)

    The request body that will eventually be converted to a string; middlewares can be used to support more complex types.

  • headers (Hash, nil)

    unencoded HTTP header key/value pairs.

Returns:



431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
# File 'lib/faraday/connection.rb', line 431

def run_request(method, url, body, headers)
  unless METHODS.include?(method)
    raise ArgumentError, "unknown http method: #{method}"
  end

  request = build_request(method) do |req|
    req.options.proxy = proxy_for_request(url)
    req.url(url)                if url
    req.headers.update(headers) if headers
    req.body = body             if body
    yield(req) if block_given?
  end

  builder.build_response(self, request)
end

#set_basic_auth(user, password) ⇒ Object



371
372
373
374
# File 'lib/faraday/connection.rb', line 371

def set_basic_auth(user, password)
  header = Faraday::Utils.basic_header_from(user, password)
  headers[Faraday::Request::Authorization::KEY] = header
end

#support_parallel?(adapter) ⇒ Boolean

Returns:

  • (Boolean)


552
553
554
# File 'lib/faraday/connection.rb', line 552

def support_parallel?(adapter)
  adapter.respond_to?(:supports_parallel?) && adapter&.supports_parallel?
end

#with_uri_credentials(uri) {|username, password| ... } ⇒ void

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.

This method returns an undefined value.

Yields username and password extracted from a URI if they both exist.

Parameters:

  • uri (URI)

Yields:

  • (username, password)

    any username and password

Yield Parameters:

  • username (String)

    any username from URI

  • password (String)

    any password from URI



508
509
510
511
512
# File 'lib/faraday/connection.rb', line 508

def with_uri_credentials(uri)
  return unless uri.user && uri.password

  yield(Utils.unescape(uri.user), Utils.unescape(uri.password))
end