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)


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

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:



461
462
463
464
465
466
467
468
# File 'lib/faraday/connection.rb', line 461

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)


415
416
417
418
419
420
421
422
423
424
425
426
427
428
# File 'lib/faraday/connection.rb', line 415

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:



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

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



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

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
329
330
331
332
333
334
335
336
# File 'lib/faraday/connection.rb', line 317

def in_parallel(manager = nil, &block)
  @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
  return yield unless @parallel_manager

  if @parallel_manager.respond_to?(:execute)
    # Execute is the new method that is responsible for executing the block.
    @parallel_manager.execute(&block)
  else
    # TODO: Old behaviour, deprecate and remove in 3.0
    yield
    @parallel_manager.run
  end
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



390
391
392
393
394
395
# File 'lib/faraday/connection.rb', line 390

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

#proxy_for_request(url) ⇒ Object



550
551
552
553
554
555
556
557
558
# File 'lib/faraday/connection.rb', line 550

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



522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
# File 'lib/faraday/connection.rb', line 522

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:



439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
# File 'lib/faraday/connection.rb', line 439

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



379
380
381
382
# File 'lib/faraday/connection.rb', line 379

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)


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

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



516
517
518
519
520
# File 'lib/faraday/connection.rb', line 516

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

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