faraday 0.9.1 → 2.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +554 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +32 -197
  5. data/Rakefile +4 -68
  6. data/examples/client_spec.rb +119 -0
  7. data/examples/client_test.rb +144 -0
  8. data/lib/faraday/adapter/test.rb +194 -58
  9. data/lib/faraday/adapter.rb +76 -20
  10. data/lib/faraday/adapter_registry.rb +30 -0
  11. data/lib/faraday/connection.rb +341 -212
  12. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  13. data/lib/faraday/encoders/nested_params_encoder.rb +183 -0
  14. data/lib/faraday/error.rb +123 -29
  15. data/lib/faraday/logging/formatter.rb +106 -0
  16. data/lib/faraday/methods.rb +6 -0
  17. data/lib/faraday/middleware.rb +18 -25
  18. data/lib/faraday/middleware_registry.rb +83 -0
  19. data/lib/faraday/options/connection_options.rb +22 -0
  20. data/lib/faraday/options/env.rb +199 -0
  21. data/lib/faraday/options/proxy_options.rb +32 -0
  22. data/lib/faraday/options/request_options.rb +22 -0
  23. data/lib/faraday/options/ssl_options.rb +69 -0
  24. data/lib/faraday/options.rb +63 -195
  25. data/lib/faraday/parameters.rb +4 -180
  26. data/lib/faraday/rack_builder.rb +99 -59
  27. data/lib/faraday/request/authorization.rb +37 -30
  28. data/lib/faraday/request/instrumentation.rb +47 -27
  29. data/lib/faraday/request/json.rb +55 -0
  30. data/lib/faraday/request/url_encoded.rb +48 -24
  31. data/lib/faraday/request.rb +76 -32
  32. data/lib/faraday/response/json.rb +54 -0
  33. data/lib/faraday/response/logger.rb +22 -48
  34. data/lib/faraday/response/raise_error.rb +57 -14
  35. data/lib/faraday/response.rb +32 -35
  36. data/lib/faraday/utils/headers.rb +139 -0
  37. data/lib/faraday/utils/params_hash.rb +61 -0
  38. data/lib/faraday/utils.rb +47 -222
  39. data/lib/faraday/version.rb +5 -0
  40. data/lib/faraday.rb +111 -222
  41. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  42. data/spec/faraday/adapter/test_spec.rb +413 -0
  43. data/spec/faraday/adapter_registry_spec.rb +28 -0
  44. data/spec/faraday/adapter_spec.rb +55 -0
  45. data/spec/faraday/connection_spec.rb +793 -0
  46. data/spec/faraday/error_spec.rb +60 -0
  47. data/spec/faraday/middleware_registry_spec.rb +31 -0
  48. data/spec/faraday/middleware_spec.rb +52 -0
  49. data/spec/faraday/options/env_spec.rb +76 -0
  50. data/spec/faraday/options/options_spec.rb +297 -0
  51. data/spec/faraday/options/proxy_options_spec.rb +44 -0
  52. data/spec/faraday/options/request_options_spec.rb +19 -0
  53. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  54. data/spec/faraday/params_encoders/nested_spec.rb +150 -0
  55. data/spec/faraday/rack_builder_spec.rb +317 -0
  56. data/spec/faraday/request/authorization_spec.rb +83 -0
  57. data/spec/faraday/request/instrumentation_spec.rb +74 -0
  58. data/spec/faraday/request/json_spec.rb +111 -0
  59. data/spec/faraday/request/url_encoded_spec.rb +93 -0
  60. data/spec/faraday/request_spec.rb +110 -0
  61. data/spec/faraday/response/json_spec.rb +117 -0
  62. data/spec/faraday/response/logger_spec.rb +220 -0
  63. data/spec/faraday/response/raise_error_spec.rb +172 -0
  64. data/spec/faraday/response_spec.rb +75 -0
  65. data/spec/faraday/utils/headers_spec.rb +82 -0
  66. data/spec/faraday/utils_spec.rb +118 -0
  67. data/spec/faraday_spec.rb +37 -0
  68. data/spec/spec_helper.rb +132 -0
  69. data/spec/support/disabling_stub.rb +14 -0
  70. data/spec/support/fake_safe_buffer.rb +15 -0
  71. data/spec/support/helper_methods.rb +96 -0
  72. data/spec/support/shared_examples/adapter.rb +105 -0
  73. data/spec/support/shared_examples/params_encoder.rb +18 -0
  74. data/spec/support/shared_examples/request_method.rb +263 -0
  75. data/spec/support/streaming_response_checker.rb +35 -0
  76. metadata +81 -109
  77. data/.document +0 -6
  78. data/CONTRIBUTING.md +0 -36
  79. data/Gemfile +0 -25
  80. data/faraday.gemspec +0 -34
  81. data/lib/faraday/adapter/em_http.rb +0 -237
  82. data/lib/faraday/adapter/em_http_ssl_patch.rb +0 -56
  83. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +0 -66
  84. data/lib/faraday/adapter/em_synchrony.rb +0 -92
  85. data/lib/faraday/adapter/excon.rb +0 -80
  86. data/lib/faraday/adapter/httpclient.rb +0 -106
  87. data/lib/faraday/adapter/net_http.rb +0 -130
  88. data/lib/faraday/adapter/net_http_persistent.rb +0 -48
  89. data/lib/faraday/adapter/patron.rb +0 -72
  90. data/lib/faraday/adapter/rack.rb +0 -58
  91. data/lib/faraday/adapter/typhoeus.rb +0 -123
  92. data/lib/faraday/autoload.rb +0 -84
  93. data/lib/faraday/request/basic_authentication.rb +0 -13
  94. data/lib/faraday/request/multipart.rb +0 -63
  95. data/lib/faraday/request/retry.rb +0 -148
  96. data/lib/faraday/request/token_authentication.rb +0 -15
  97. data/lib/faraday/upload_io.rb +0 -67
  98. data/script/cached-bundle +0 -46
  99. data/script/console +0 -7
  100. data/script/generate_certs +0 -42
  101. data/script/package +0 -7
  102. data/script/proxy-server +0 -42
  103. data/script/release +0 -17
  104. data/script/s3-put +0 -71
  105. data/script/server +0 -36
  106. data/script/test +0 -172
  107. data/test/adapters/default_test.rb +0 -14
  108. data/test/adapters/em_http_test.rb +0 -20
  109. data/test/adapters/em_synchrony_test.rb +0 -20
  110. data/test/adapters/excon_test.rb +0 -20
  111. data/test/adapters/httpclient_test.rb +0 -21
  112. data/test/adapters/integration.rb +0 -254
  113. data/test/adapters/logger_test.rb +0 -82
  114. data/test/adapters/net_http_persistent_test.rb +0 -20
  115. data/test/adapters/net_http_test.rb +0 -14
  116. data/test/adapters/patron_test.rb +0 -20
  117. data/test/adapters/rack_test.rb +0 -31
  118. data/test/adapters/test_middleware_test.rb +0 -114
  119. data/test/adapters/typhoeus_test.rb +0 -28
  120. data/test/authentication_middleware_test.rb +0 -65
  121. data/test/composite_read_io_test.rb +0 -111
  122. data/test/connection_test.rb +0 -522
  123. data/test/env_test.rb +0 -218
  124. data/test/helper.rb +0 -81
  125. data/test/live_server.rb +0 -67
  126. data/test/middleware/instrumentation_test.rb +0 -88
  127. data/test/middleware/retry_test.rb +0 -177
  128. data/test/middleware_stack_test.rb +0 -173
  129. data/test/multibyte.txt +0 -1
  130. data/test/options_test.rb +0 -252
  131. data/test/parameters_test.rb +0 -64
  132. data/test/request_middleware_test.rb +0 -142
  133. data/test/response_middleware_test.rb +0 -72
  134. data/test/strawberry.rb +0 -2
  135. data/test/utils_test.rb +0 -58
@@ -1,66 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class EMSynchrony < Faraday::Adapter
4
- class ParallelManager
5
-
6
- # Add requests to queue. The `request` argument should be a
7
- # `EM::HttpRequest` object.
8
- def add(request, method, *args, &block)
9
- queue << {
10
- :request => request,
11
- :method => method,
12
- :args => args,
13
- :block => block
14
- }
15
- end
16
-
17
- # Run all requests on queue with `EM::Synchrony::Multi`, wrapping
18
- # it in a reactor and fiber if needed.
19
- def run
20
- result = nil
21
- if !EM.reactor_running?
22
- EM.run {
23
- Fiber.new do
24
- result = perform
25
- EM.stop
26
- end.resume
27
- }
28
- else
29
- result = perform
30
- end
31
- result
32
- end
33
-
34
-
35
- private
36
-
37
- # The request queue.
38
- def queue
39
- @queue ||= []
40
- end
41
-
42
- # Main `EM::Synchrony::Multi` performer.
43
- def perform
44
- multi = ::EM::Synchrony::Multi.new
45
-
46
- queue.each do |item|
47
- method = "a#{item[:method]}".to_sym
48
-
49
- req = item[:request].send(method, *item[:args])
50
- req.callback(&item[:block])
51
-
52
- req_name = "req_#{multi.requests.size}".to_sym
53
- multi.add(req_name, req)
54
- end
55
-
56
- # Clear the queue, so parallel manager objects can be reused.
57
- @queue = []
58
-
59
- # Block fiber until all requests have returned.
60
- multi.perform
61
- end
62
-
63
- end # ParallelManager
64
- end # EMSynchrony
65
- end # Adapter
66
- end # Faraday
@@ -1,92 +0,0 @@
1
- require 'uri'
2
-
3
- module Faraday
4
- class Adapter
5
- class EMSynchrony < Faraday::Adapter
6
- include EMHttp::Options
7
-
8
- dependency do
9
- require 'em-synchrony/em-http'
10
- require 'em-synchrony/em-multi'
11
- require 'fiber'
12
- end
13
-
14
- self.supports_parallel = true
15
-
16
- def self.setup_parallel_manager(options = {})
17
- ParallelManager.new
18
- end
19
-
20
- def call(env)
21
- super
22
- request = EventMachine::HttpRequest.new(Utils::URI(env[:url].to_s), connection_config(env))
23
-
24
- http_method = env[:method].to_s.downcase.to_sym
25
-
26
- # Queue requests for parallel execution.
27
- if env[:parallel_manager]
28
- env[:parallel_manager].add(request, http_method, request_config(env)) do |resp|
29
- save_response(env, resp.response_header.status, resp.response) do |resp_headers|
30
- resp.response_header.each do |name, value|
31
- resp_headers[name.to_sym] = value
32
- end
33
- end
34
-
35
- # Finalize the response object with values from `env`.
36
- env[:response].finish(env)
37
- end
38
-
39
- # Execute single request.
40
- else
41
- client = nil
42
- block = lambda { request.send(http_method, request_config(env)) }
43
-
44
- if !EM.reactor_running?
45
- EM.run do
46
- Fiber.new {
47
- client = block.call
48
- EM.stop
49
- }.resume
50
- end
51
- else
52
- client = block.call
53
- end
54
-
55
- raise client.error if client.error
56
-
57
- save_response(env, client.response_header.status, client.response) do |resp_headers|
58
- client.response_header.each do |name, value|
59
- resp_headers[name.to_sym] = value
60
- end
61
- end
62
- end
63
-
64
- @app.call env
65
- rescue Errno::ECONNREFUSED
66
- raise Error::ConnectionFailed, $!
67
- rescue EventMachine::Connectify::CONNECTError => err
68
- if err.message.include?("Proxy Authentication Required")
69
- raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
70
- else
71
- raise Error::ConnectionFailed, err
72
- end
73
- rescue => err
74
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
75
- raise Faraday::SSLError, err
76
- else
77
- raise
78
- end
79
- end
80
- end
81
- end
82
- end
83
-
84
- require 'faraday/adapter/em_synchrony/parallel_manager'
85
-
86
- begin
87
- require 'openssl'
88
- rescue LoadError
89
- warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
90
- else
91
- require 'faraday/adapter/em_http_ssl_patch'
92
- end if Faraday::Adapter::EMSynchrony.loaded?
@@ -1,80 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class Excon < Faraday::Adapter
4
- dependency 'excon'
5
-
6
- def initialize(app, connection_options = {})
7
- @connection_options = connection_options
8
- super(app)
9
- end
10
-
11
- def call(env)
12
- super
13
-
14
- opts = {}
15
- if env[:url].scheme == 'https' && ssl = env[:ssl]
16
- opts[:ssl_verify_peer] = !!ssl.fetch(:verify, true)
17
- opts[:ssl_ca_path] = ssl[:ca_path] if ssl[:ca_path]
18
- opts[:ssl_ca_file] = ssl[:ca_file] if ssl[:ca_file]
19
- opts[:client_cert] = ssl[:client_cert] if ssl[:client_cert]
20
- opts[:client_key] = ssl[:client_key] if ssl[:client_key]
21
- opts[:certificate] = ssl[:certificate] if ssl[:certificate]
22
- opts[:private_key] = ssl[:private_key] if ssl[:private_key]
23
-
24
- # https://github.com/geemus/excon/issues/106
25
- # https://github.com/jruby/jruby-ossl/issues/19
26
- opts[:nonblock] = false
27
- end
28
-
29
- if ( req = env[:request] )
30
- if req[:timeout]
31
- opts[:read_timeout] = req[:timeout]
32
- opts[:connect_timeout] = req[:timeout]
33
- opts[:write_timeout] = req[:timeout]
34
- end
35
-
36
- if req[:open_timeout]
37
- opts[:connect_timeout] = req[:open_timeout]
38
- opts[:write_timeout] = req[:open_timeout]
39
- end
40
-
41
- if req[:proxy]
42
- opts[:proxy] = {
43
- :host => req[:proxy][:uri].host,
44
- :port => req[:proxy][:uri].port,
45
- :scheme => req[:proxy][:uri].scheme,
46
- :user => req[:proxy][:user],
47
- :password => req[:proxy][:password]
48
- }
49
- end
50
- end
51
-
52
- conn = ::Excon.new(env[:url].to_s, opts.merge(@connection_options))
53
-
54
- resp = conn.request \
55
- :method => env[:method].to_s.upcase,
56
- :headers => env[:request_headers],
57
- :body => read_body(env)
58
-
59
- save_response(env, resp.status.to_i, resp.body, resp.headers)
60
-
61
- @app.call env
62
- rescue ::Excon::Errors::SocketError => err
63
- if err.message =~ /\btimeout\b/
64
- raise Error::TimeoutError, err
65
- elsif err.message =~ /\bcertificate\b/
66
- raise Faraday::SSLError, err
67
- else
68
- raise Error::ConnectionFailed, err
69
- end
70
- rescue ::Excon::Errors::Timeout => err
71
- raise Error::TimeoutError, err
72
- end
73
-
74
- # TODO: support streaming requests
75
- def read_body(env)
76
- env[:body].respond_to?(:read) ? env[:body].read : env[:body]
77
- end
78
- end
79
- end
80
- end
@@ -1,106 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class HTTPClient < Faraday::Adapter
4
- dependency 'httpclient'
5
-
6
- def client
7
- @client ||= ::HTTPClient.new
8
- end
9
-
10
- def call(env)
11
- super
12
-
13
- if req = env[:request]
14
- if proxy = req[:proxy]
15
- configure_proxy proxy
16
- end
17
-
18
- if bind = req[:bind]
19
- configure_socket bind
20
- end
21
-
22
- configure_timeouts req
23
- end
24
-
25
- if env[:url].scheme == 'https' && ssl = env[:ssl]
26
- configure_ssl ssl
27
- end
28
-
29
- # TODO Don't stream yet.
30
- # https://github.com/nahi/httpclient/pull/90
31
- env[:body] = env[:body].read if env[:body].respond_to? :read
32
-
33
- resp = client.request env[:method], env[:url],
34
- :body => env[:body],
35
- :header => env[:request_headers]
36
-
37
- save_response env, resp.status, resp.body, resp.headers
38
-
39
- @app.call env
40
- rescue ::HTTPClient::TimeoutError
41
- raise Faraday::Error::TimeoutError, $!
42
- rescue ::HTTPClient::BadResponseError => err
43
- if err.message.include?('status 407')
44
- raise Faraday::Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
45
- else
46
- raise Faraday::Error::ClientError, $!
47
- end
48
- rescue Errno::ECONNREFUSED, EOFError
49
- raise Faraday::Error::ConnectionFailed, $!
50
- rescue => err
51
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
52
- raise Faraday::SSLError, err
53
- else
54
- raise
55
- end
56
- end
57
-
58
- def configure_socket(bind)
59
- client.socket_local.host = bind[:host]
60
- client.socket_local.port = bind[:port]
61
- end
62
-
63
- def configure_proxy(proxy)
64
- client.proxy = proxy[:uri]
65
- if proxy[:user] && proxy[:password]
66
- client.set_proxy_auth proxy[:user], proxy[:password]
67
- end
68
- end
69
-
70
- def configure_ssl(ssl)
71
- ssl_config = client.ssl_config
72
-
73
- ssl_config.add_trust_ca ssl[:ca_file] if ssl[:ca_file]
74
- ssl_config.add_trust_ca ssl[:ca_path] if ssl[:ca_path]
75
- ssl_config.cert_store = ssl[:cert_store] if ssl[:cert_store]
76
- ssl_config.client_cert = ssl[:client_cert] if ssl[:client_cert]
77
- ssl_config.client_key = ssl[:client_key] if ssl[:client_key]
78
- ssl_config.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
79
- ssl_config.verify_mode = ssl_verify_mode(ssl)
80
- end
81
-
82
- def configure_timeouts(req)
83
- if req[:timeout]
84
- client.connect_timeout = req[:timeout]
85
- client.receive_timeout = req[:timeout]
86
- client.send_timeout = req[:timeout]
87
- end
88
-
89
- if req[:open_timeout]
90
- client.connect_timeout = req[:open_timeout]
91
- client.send_timeout = req[:open_timeout]
92
- end
93
- end
94
-
95
- def ssl_verify_mode(ssl)
96
- ssl[:verify_mode] || begin
97
- if ssl.fetch(:verify, true)
98
- OpenSSL::SSL::VERIFY_PEER | OpenSSL::SSL::VERIFY_FAIL_IF_NO_PEER_CERT
99
- else
100
- OpenSSL::SSL::VERIFY_NONE
101
- end
102
- end
103
- end
104
- end
105
- end
106
- end
@@ -1,130 +0,0 @@
1
- begin
2
- require 'net/https'
3
- rescue LoadError
4
- warn "Warning: no such file to load -- net/https. Make sure openssl is installed if you want ssl support"
5
- require 'net/http'
6
- end
7
- require 'zlib'
8
-
9
- module Faraday
10
- class Adapter
11
- class NetHttp < Faraday::Adapter
12
- NET_HTTP_EXCEPTIONS = [
13
- EOFError,
14
- Errno::ECONNABORTED,
15
- Errno::ECONNREFUSED,
16
- Errno::ECONNRESET,
17
- Errno::EHOSTUNREACH,
18
- Errno::EINVAL,
19
- Errno::ENETUNREACH,
20
- Net::HTTPBadResponse,
21
- Net::HTTPHeaderSyntaxError,
22
- Net::ProtocolError,
23
- SocketError,
24
- Zlib::GzipFile::Error,
25
- ]
26
-
27
- NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
28
- NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
29
-
30
- def call(env)
31
- super
32
- with_net_http_connection(env) do |http|
33
- configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
34
-
35
- req = env[:request]
36
- http.read_timeout = http.open_timeout = req[:timeout] if req[:timeout]
37
- http.open_timeout = req[:open_timeout] if req[:open_timeout]
38
-
39
- begin
40
- http_response = perform_request(http, env)
41
- rescue *NET_HTTP_EXCEPTIONS => err
42
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
43
- raise Faraday::SSLError, err
44
- else
45
- raise Error::ConnectionFailed, err
46
- end
47
- end
48
-
49
- save_response(env, http_response.code.to_i, http_response.body || '') do |response_headers|
50
- http_response.each_header do |key, value|
51
- response_headers[key] = value
52
- end
53
- end
54
- end
55
-
56
- @app.call env
57
- rescue Timeout::Error => err
58
- raise Faraday::Error::TimeoutError, err
59
- end
60
-
61
- def create_request(env)
62
- request = Net::HTTPGenericRequest.new \
63
- env[:method].to_s.upcase, # request method
64
- !!env[:body], # is there request body
65
- :head != env[:method], # is there response body
66
- env[:url].request_uri, # request uri path
67
- env[:request_headers] # request headers
68
-
69
- if env[:body].respond_to?(:read)
70
- request.body_stream = env[:body]
71
- else
72
- request.body = env[:body]
73
- end
74
- request
75
- end
76
-
77
- def perform_request(http, env)
78
- if :get == env[:method] and !env[:body]
79
- # prefer `get` to `request` because the former handles gzip (ruby 1.9)
80
- http.get env[:url].request_uri, env[:request_headers]
81
- else
82
- http.request create_request(env)
83
- end
84
- end
85
-
86
- def with_net_http_connection(env)
87
- yield net_http_connection(env)
88
- end
89
-
90
- def net_http_connection(env)
91
- if proxy = env[:request][:proxy]
92
- Net::HTTP::Proxy(proxy[:uri].host, proxy[:uri].port, proxy[:user], proxy[:password])
93
- else
94
- Net::HTTP
95
- end.new(env[:url].host, env[:url].port)
96
- end
97
-
98
- def configure_ssl(http, ssl)
99
- http.use_ssl = true
100
- http.verify_mode = ssl_verify_mode(ssl)
101
- http.cert_store = ssl_cert_store(ssl)
102
-
103
- http.cert = ssl[:client_cert] if ssl[:client_cert]
104
- http.key = ssl[:client_key] if ssl[:client_key]
105
- http.ca_file = ssl[:ca_file] if ssl[:ca_file]
106
- http.ca_path = ssl[:ca_path] if ssl[:ca_path]
107
- http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
108
- http.ssl_version = ssl[:version] if ssl[:version]
109
- end
110
-
111
- def ssl_cert_store(ssl)
112
- return ssl[:cert_store] if ssl[:cert_store]
113
- # Use the default cert store by default, i.e. system ca certs
114
- cert_store = OpenSSL::X509::Store.new
115
- cert_store.set_default_paths
116
- cert_store
117
- end
118
-
119
- def ssl_verify_mode(ssl)
120
- ssl[:verify_mode] || begin
121
- if ssl.fetch(:verify, true)
122
- OpenSSL::SSL::VERIFY_PEER
123
- else
124
- OpenSSL::SSL::VERIFY_NONE
125
- end
126
- end
127
- end
128
- end
129
- end
130
- end
@@ -1,48 +0,0 @@
1
- # Rely on autoloading instead of explicit require; helps avoid the "already
2
- # initialized constant" warning on Ruby 1.8.7 when NetHttp is refereced below.
3
- # require 'faraday/adapter/net_http'
4
-
5
- module Faraday
6
- class Adapter
7
- # Experimental adapter for net-http-persistent
8
- class NetHttpPersistent < NetHttp
9
- dependency 'net/http/persistent'
10
-
11
- def with_net_http_connection(env)
12
- if proxy = env[:request][:proxy]
13
- proxy_uri = ::URI::HTTP === proxy[:uri] ? proxy[:uri].dup : ::URI.parse(proxy[:uri].to_s)
14
- proxy_uri.user = proxy_uri.password = nil
15
- # awful patch for net-http-persistent 2.8 not unescaping user/password
16
- (class << proxy_uri; self; end).class_eval do
17
- define_method(:user) { proxy[:user] }
18
- define_method(:password) { proxy[:password] }
19
- end if proxy[:user]
20
- end
21
-
22
- yield Net::HTTP::Persistent.new 'Faraday', proxy_uri
23
- end
24
-
25
- def perform_request(http, env)
26
- http.request env[:url], create_request(env)
27
- rescue Net::HTTP::Persistent::Error => error
28
- if error.message.include? 'Timeout'
29
- raise Faraday::Error::TimeoutError, error
30
- elsif error.message.include? 'connection refused'
31
- raise Faraday::Error::ConnectionFailed, error
32
- else
33
- raise
34
- end
35
- end
36
-
37
- def configure_ssl(http, ssl)
38
- http.verify_mode = ssl_verify_mode(ssl)
39
- http.cert_store = ssl_cert_store(ssl)
40
-
41
- http.certificate = ssl[:client_cert] if ssl[:client_cert]
42
- http.private_key = ssl[:client_key] if ssl[:client_key]
43
- http.ca_file = ssl[:ca_file] if ssl[:ca_file]
44
- http.ssl_version = ssl[:version] if ssl[:version]
45
- end
46
- end
47
- end
48
- end
@@ -1,72 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- class Patron < Faraday::Adapter
4
- dependency 'patron'
5
-
6
- def initialize(app, &block)
7
- super(app)
8
- @block = block
9
- end
10
-
11
- def call(env)
12
- super
13
-
14
- # TODO: support streaming requests
15
- env[:body] = env[:body].read if env[:body].respond_to? :read
16
-
17
- session = @session ||= create_session
18
-
19
- if req = env[:request]
20
- session.timeout = session.connect_timeout = req[:timeout] if req[:timeout]
21
- session.connect_timeout = req[:open_timeout] if req[:open_timeout]
22
-
23
- if proxy = req[:proxy]
24
- proxy_uri = proxy[:uri].dup
25
- proxy_uri.user = proxy[:user] && Utils.escape(proxy[:user]).gsub('+', '%20')
26
- proxy_uri.password = proxy[:password] && Utils.escape(proxy[:password]).gsub('+', '%20')
27
- session.proxy = proxy_uri.to_s
28
- end
29
- end
30
-
31
- response = begin
32
- data = env[:body] ? env[:body].to_s : nil
33
- session.request(env[:method], env[:url].to_s, env[:request_headers], :data => data)
34
- rescue Errno::ECONNREFUSED, ::Patron::ConnectionFailed
35
- raise Error::ConnectionFailed, $!
36
- end
37
-
38
- save_response(env, response.status, response.body, response.headers)
39
-
40
- @app.call env
41
- rescue ::Patron::TimeoutError => err
42
- if err.message == "Connection time-out"
43
- raise Faraday::Error::ConnectionFailed, err
44
- else
45
- raise Faraday::Error::TimeoutError, err
46
- end
47
- rescue ::Patron::Error => err
48
- if err.message.include?("code 407")
49
- raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
50
- else
51
- raise Error::ConnectionFailed, err
52
- end
53
- end
54
-
55
- if loaded? && defined?(::Patron::Request::VALID_ACTIONS)
56
- # HAX: helps but doesn't work completely
57
- # https://github.com/toland/patron/issues/34
58
- ::Patron::Request::VALID_ACTIONS.tap do |actions|
59
- actions << :patch unless actions.include? :patch
60
- actions << :options unless actions.include? :options
61
- end
62
- end
63
-
64
- def create_session
65
- session = ::Patron::Session.new
66
- session.insecure = true
67
- @block.call(session) if @block
68
- session
69
- end
70
- end
71
- end
72
- end
@@ -1,58 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- # Sends requests to a Rack app.
4
- #
5
- # Examples
6
- #
7
- # class MyRackApp
8
- # def call(env)
9
- # [200, {'Content-Type' => 'text/html'}, ["hello world"]]
10
- # end
11
- # end
12
- #
13
- # Faraday.new do |conn|
14
- # conn.adapter :rack, MyRackApp.new
15
- # end
16
- class Rack < Faraday::Adapter
17
- dependency 'rack/test'
18
-
19
- # not prefixed with "HTTP_"
20
- SPECIAL_HEADERS = %w[ CONTENT_LENGTH CONTENT_TYPE ]
21
-
22
- def initialize(faraday_app, rack_app)
23
- super(faraday_app)
24
- mock_session = ::Rack::MockSession.new(rack_app)
25
- @session = ::Rack::Test::Session.new(mock_session)
26
- end
27
-
28
- def call(env)
29
- super
30
- rack_env = {
31
- :method => env[:method],
32
- :input => env[:body].respond_to?(:read) ? env[:body].read : env[:body],
33
- 'rack.url_scheme' => env[:url].scheme
34
- }
35
-
36
- env[:request_headers].each do |name, value|
37
- name = name.upcase.tr('-', '_')
38
- name = "HTTP_#{name}" unless SPECIAL_HEADERS.include? name
39
- rack_env[name] = value
40
- end if env[:request_headers]
41
-
42
- timeout = env[:request][:timeout] || env[:request][:open_timeout]
43
- response = if timeout
44
- Timer.timeout(timeout, Faraday::Error::TimeoutError) { execute_request(env, rack_env) }
45
- else
46
- execute_request(env, rack_env)
47
- end
48
-
49
- save_response(env, response.status, response.body, response.headers)
50
- @app.call env
51
- end
52
-
53
- def execute_request(env, rack_env)
54
- @session.request(env[:url].to_s, rack_env)
55
- end
56
- end
57
- end
58
- end