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://sushi.com'

# GET http://sushi.com/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]

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


62
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
# File 'lib/faraday/connection.rb', line 62

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

  if url.is_a?(Hash) || url.is_a?(ConnectionOptions)
    options = options.merge(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

  @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] ||= "Faraday v#{VERSION}"
end

Instance Attribute Details

#builderFaraday::Builder (readonly)

Returns Builder for this Connection.

Returns:

  • (Faraday::Builder)

    Builder for this Connection.


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

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


346
347
348
349
350
351
352
353
354
355
356
# File 'lib/faraday/connection.rb', line 346

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.


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

def headers
  @headers
end

#parallel_managerObject (readonly)

Returns the parallel manager for this Connection.

Returns:

  • (Object)

    the parallel manager for this Connection.


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

def parallel_manager
  @parallel_manager
end

#paramsHash

Returns URI query unencoded key/value pairs.

Returns:

  • (Hash)

    URI query unencoded key/value pairs.


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

def params
  @params
end

#proxyHash

Returns proxy options.

Returns:

  • (Hash)

    proxy options.


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

def proxy
  @proxy
end

#sslHash (readonly)

Returns SSL options.

Returns:

  • (Hash)

    SSL options.


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

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.


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

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) (defaults to: nil)

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

  • params (Hash) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

.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) (defaults to: nil)

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

  • params (Hash) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

.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) (defaults to: nil)

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

  • params (Hash) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

.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) (defaults to: nil)

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

  • body (String) (defaults to: nil)

    body for the request.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

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

Makes a PUT HTTP request with a body.

Examples:

# TODO: Make it a PUT example
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) (defaults to: nil)

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

  • body (String) (defaults to: nil)

    body for the request.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

.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) (defaults to: nil)

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

  • params (Hash) (defaults to: nil)

    Hash of URI query unencoded key/value pairs.

  • headers (Hash) (defaults to: nil)

    unencoded HTTP header key/value pairs.

Yields:

Returns:


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

Instance Method Details

#authorization(type, token) ⇒ void

This method returns an undefined value.

Sets up a custom Authorization header.

Examples:


conn.authorization :Bearer, 'mF_9.B5f-4.1JqM'
conn.headers['Authorization']
# => "Bearer mF_9.B5f-4.1JqM"

conn.authorization :Token, token: 'abcdef', foo: 'bar'
conn.headers['Authorization']
# => "Token token=\"abcdef\",
            foo=\"bar\""

Parameters:

  • type (String)

    authorization type

  • token (String, Hash)

    token. A String value is taken literally, and a Hash is encoded into comma-separated key/value pairs.


336
337
338
# File 'lib/faraday/connection.rb', line 336

def authorization(type, token)
  set_authorization_header(:authorization, type, token)
end

#basic_auth(login, pass) ⇒ void

This method returns an undefined value.

Sets up the Authorization header with these credentials, encoded with base64.

Examples:


conn.basic_auth 'Aladdin', 'open sesame'
conn.headers['Authorization']
# => "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ=="

Parameters:

  • login (String)

    The authentication login.

  • pass (String)

    The authentication password.


297
298
299
# File 'lib/faraday/connection.rb', line 297

def basic_auth(, pass)
  set_authorization_header(:basic_auth, , pass)
end

#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) (defaults to: nil)
  • params (Faraday::Utils::ParamsHash) (defaults to: nil)

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

Returns:

  • (URI)

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

def build_exclusive_url(url = nil, params = nil, params_encoder = nil)
  url = nil if url.respond_to?(:empty?) && url.empty?
  base = url_prefix
  if url && base.path && base.path !~ %r{/$}
    base = base.dup
    base.path = "#{base.path}/" # ensure trailing slash
  end
  url = url && URI.parse(url.to_s).opaque ? url.to_s.gsub(':', '%3A') : url
  uri = url ? base + url : base
  if params
    uri.query = params.to_query(params_encoder || options.params_encoder)
  end
  # rubocop:disable Style/SafeNavigation
  uri.query = nil if uri.query && uri.query.empty?
  # rubocop:enable Style/SafeNavigation
  uri
end

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

Creates and configures the request object.

Parameters:

  • method (Symbol)

Yields:

Returns:


501
502
503
504
505
506
507
508
# File 'lib/faraday/connection.rb', line 501

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://sushi.com/api?token=abc"
conn.scheme      # => https
conn.path_prefix # => "/api"

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

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

Parameters:

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

455
456
457
458
459
460
461
462
463
464
465
466
467
468
# File 'lib/faraday/connection.rb', line 455

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.


123
124
125
# File 'lib/faraday/connection.rb', line 123

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:


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

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


593
594
595
596
597
598
599
# File 'lib/faraday/connection.rb', line 593

def find_default_proxy
  uri = ENV['http_proxy']
  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.


372
373
374
375
376
377
378
379
380
381
382
383
# File 'lib/faraday/connection.rb', line 372

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)

361
362
363
# File 'lib/faraday/connection.rb', line 361

def in_parallel?
  !!@parallel_manager
end

#initialize_proxy(url, options) ⇒ Object


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

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)

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

    • params (Hash) (defaults to: nil)

      Hash of URI query unencoded key/value pairs.

    • headers (Hash) (defaults to: nil)

      unencoded HTTP header key/value pairs.

Yields:

Returns:


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

def options(*args)
  return @options if args.size.zero?

  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


430
431
432
433
434
435
# File 'lib/faraday/connection.rb', line 430

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

#proxy_for_request(url) ⇒ Object


601
602
603
604
605
606
607
608
609
# File 'lib/faraday/connection.rb', line 601

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


572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
# File 'lib/faraday/connection.rb', line 572

def proxy_from_env(url)
  return if Faraday.ignore_env_proxy

  uri = nil
  if URI.parse('').respond_to?(:find_proxy)
    case url
    when String
      uri = Utils.URI(url)
      uri = URI.parse("#{uri.scheme}://#{uri.host}").find_proxy
    when URI
      uri = url.find_proxy
    when nil
      uri = find_default_proxy
    end
  else
    warn 'no_proxy is unsupported' if ENV['no_proxy'] || ENV['NO_PROXY']
    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)

    String or URI to access.

  • body (Object)

    The request body that will eventually be converted to a string.

  • headers (Hash)

    unencoded HTTP header key/value pairs.

Returns:


479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
# File 'lib/faraday/connection.rb', line 479

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_authorization_header(header_type, *args) ⇒ Object


564
565
566
567
568
569
570
# File 'lib/faraday/connection.rb', line 564

def set_authorization_header(header_type, *args)
  header = Faraday::Request
           .lookup_middleware(header_type)
           .header(*args)

  headers[Faraday::Request::Authorization::KEY] = header
end

#support_parallel?(adapter) ⇒ Boolean

Returns:

  • (Boolean)

611
612
613
# File 'lib/faraday/connection.rb', line 611

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

#token_auth(token, options = nil) ⇒ void

This method returns an undefined value.

Sets up the Authorization header with the given token.

Examples:


conn.token_auth 'abcdef', foo: 'bar'
conn.headers['Authorization']
# => "Token token=\"abcdef\",
            foo=\"bar\""

Parameters:

  • token (String)
  • options (Hash) (defaults to: nil)

    extra token options.


314
315
316
# File 'lib/faraday/connection.rb', line 314

def token_auth(token, options = nil)
  set_authorization_header(:token_auth, token, options)
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


558
559
560
561
562
# File 'lib/faraday/connection.rb', line 558

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

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