Class: Faraday::Adapter::NetHttp

Inherits:
Faraday::Adapter show all
Defined in:
lib/faraday/adapter/net_http.rb

Direct Known Subclasses

NetHttpPersistent

Constant Summary collapse

NET_HTTP_EXCEPTIONS =
[
  EOFError,
  Errno::ECONNABORTED,
  Errno::ECONNREFUSED,
  Errno::ECONNRESET,
  Errno::EHOSTUNREACH,
  Errno::EINVAL,
  Errno::ENETUNREACH,
  Net::HTTPBadResponse,
  Net::HTTPHeaderSyntaxError,
  Net::ProtocolError,
  SocketError,
  Zlib::GzipFile::Error,
]

Constants inherited from Faraday::Adapter

CONTENT_LENGTH

Instance Attribute Summary

Attributes included from Parallelism

#supports_parallel

Instance Method Summary collapse

Methods inherited from Faraday::Adapter

#save_response

Methods included from Faraday::AutoloadHelper

#all_loaded_constants, #autoload_all, #load_autoloaded_constants

Methods included from Parallelism

#inherited, #supports_parallel?

Methods inherited from Middleware

dependency, inherited, #initialize, loaded?, new

Methods included from MiddlewareRegistry

#fetch_middleware, #load_middleware, #lookup_middleware, #middleware_mutex, #register_middleware

Constructor Details

This class inherits a constructor from Faraday::Middleware

Instance Method Details

#call(env) ⇒ Object


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/faraday/adapter/net_http.rb', line 30

def call(env)
  super
  with_net_http_connection(env) do |http|
    configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]

    req = env[:request]
    http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
    http.open_timeout = req[:open_timeout]                if req[:open_timeout]

    begin
      http_response = perform_request(http, env)
    rescue *NET_HTTP_EXCEPTIONS => err
      if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
        raise Faraday::SSLError, err
      else
        raise Error::ConnectionFailed, err
      end
    end

    save_response(env, http_response.code.to_i, http_response.body || '') do |response_headers|
      http_response.each_header do |key, value|
        response_headers[key] = value
      end
    end
  end

  @app.call env
rescue Timeout::Error, Errno::ETIMEDOUT => err
  raise Faraday::Error::TimeoutError, err
end

#configure_ssl(http, ssl) ⇒ Object


98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/faraday/adapter/net_http.rb', line 98

def configure_ssl(http, ssl)
  http.use_ssl      = true
  http.verify_mode  = ssl_verify_mode(ssl)
  http.cert_store   = ssl_cert_store(ssl)

  http.cert         = ssl[:client_cert]  if ssl[:client_cert]
  http.key          = ssl[:client_key]   if ssl[:client_key]
  http.ca_file      = ssl[:ca_file]      if ssl[:ca_file]
  http.ca_path      = ssl[:ca_path]      if ssl[:ca_path]
  http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
  http.ssl_version  = ssl[:version]      if ssl[:version]
end

#create_request(env) ⇒ Object


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/faraday/adapter/net_http.rb', line 61

def create_request(env)
  request = Net::HTTPGenericRequest.new \
    env[:method].to_s.upcase,    # request method
    !!env[:body],                # is there request body
    :head != env[:method],       # is there response body
    env[:url].request_uri,       # request uri path
    env[:request_headers]        # request headers

  if env[:body].respond_to?(:read)
    request.body_stream = env[:body]
  else
    request.body = env[:body]
  end
  request
end

#net_http_connection(env) ⇒ Object


90
91
92
93
94
95
96
# File 'lib/faraday/adapter/net_http.rb', line 90

def net_http_connection(env)
  if proxy = env[:request][:proxy]
    Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password])
  else
    Net::HTTP
  end.new(env[:url].host, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
end

#perform_request(http, env) ⇒ Object


77
78
79
80
81
82
83
84
# File 'lib/faraday/adapter/net_http.rb', line 77

def perform_request(http, env)
  if :get == env[:method] and !env[:body]
    # prefer `get` to `request` because the former handles gzip (ruby 1.9)
    http.get env[:url].request_uri, env[:request_headers]
  else
    http.request create_request(env)
  end
end

#ssl_cert_store(ssl) ⇒ Object


111
112
113
114
115
116
117
# File 'lib/faraday/adapter/net_http.rb', line 111

def ssl_cert_store(ssl)
  return ssl[:cert_store] if ssl[:cert_store]
  # Use the default cert store by default, i.e. system ca certs
  cert_store = OpenSSL::X509::Store.new
  cert_store.set_default_paths
  cert_store
end

#ssl_verify_mode(ssl) ⇒ Object


119
120
121
122
123
124
125
126
127
# File 'lib/faraday/adapter/net_http.rb', line 119

def ssl_verify_mode(ssl)
  ssl[:verify_mode] || begin
    if ssl.fetch(:verify, true)
      OpenSSL::SSL::VERIFY_PEER
    else
      OpenSSL::SSL::VERIFY_NONE
    end
  end
end

#with_net_http_connection(env) {|net_http_connection(env)| ... } ⇒ Object

Yields:


86
87
88
# File 'lib/faraday/adapter/net_http.rb', line 86

def with_net_http_connection(env)
  yield net_http_connection(env)
end