faraday 0.15.4 → 1.3.0

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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +350 -0
  3. data/LICENSE.md +1 -1
  4. data/README.md +17 -344
  5. data/Rakefile +7 -0
  6. data/examples/client_spec.rb +65 -0
  7. data/examples/client_test.rb +79 -0
  8. data/lib/faraday.rb +118 -190
  9. data/lib/faraday/adapter.rb +82 -22
  10. data/lib/faraday/adapter/em_http.rb +150 -104
  11. data/lib/faraday/adapter/em_http_ssl_patch.rb +24 -18
  12. data/lib/faraday/adapter/em_synchrony.rb +110 -63
  13. data/lib/faraday/adapter/em_synchrony/parallel_manager.rb +18 -15
  14. data/lib/faraday/adapter/excon.rb +98 -56
  15. data/lib/faraday/adapter/httpclient.rb +83 -59
  16. data/lib/faraday/adapter/net_http_persistent.rb +51 -28
  17. data/lib/faraday/adapter/patron.rb +80 -43
  18. data/lib/faraday/adapter/rack.rb +30 -13
  19. data/lib/faraday/adapter/test.rb +86 -53
  20. data/lib/faraday/adapter/typhoeus.rb +4 -1
  21. data/lib/faraday/adapter_registry.rb +30 -0
  22. data/lib/faraday/autoload.rb +46 -36
  23. data/lib/faraday/connection.rb +312 -182
  24. data/lib/faraday/dependency_loader.rb +37 -0
  25. data/lib/faraday/encoders/flat_params_encoder.rb +105 -0
  26. data/lib/faraday/encoders/nested_params_encoder.rb +176 -0
  27. data/lib/faraday/error.rb +123 -37
  28. data/lib/faraday/file_part.rb +128 -0
  29. data/lib/faraday/logging/formatter.rb +105 -0
  30. data/lib/faraday/methods.rb +6 -0
  31. data/lib/faraday/middleware.rb +19 -25
  32. data/lib/faraday/middleware_registry.rb +129 -0
  33. data/lib/faraday/options.rb +39 -194
  34. data/lib/faraday/options/connection_options.rb +22 -0
  35. data/lib/faraday/options/env.rb +181 -0
  36. data/lib/faraday/options/proxy_options.rb +28 -0
  37. data/lib/faraday/options/request_options.rb +22 -0
  38. data/lib/faraday/options/ssl_options.rb +59 -0
  39. data/lib/faraday/param_part.rb +53 -0
  40. data/lib/faraday/parameters.rb +4 -197
  41. data/lib/faraday/rack_builder.rb +77 -65
  42. data/lib/faraday/request.rb +86 -44
  43. data/lib/faraday/request/authorization.rb +44 -30
  44. data/lib/faraday/request/basic_authentication.rb +14 -7
  45. data/lib/faraday/request/instrumentation.rb +45 -27
  46. data/lib/faraday/request/multipart.rb +86 -48
  47. data/lib/faraday/request/retry.rb +198 -169
  48. data/lib/faraday/request/token_authentication.rb +15 -10
  49. data/lib/faraday/request/url_encoded.rb +43 -23
  50. data/lib/faraday/response.rb +27 -23
  51. data/lib/faraday/response/logger.rb +22 -69
  52. data/lib/faraday/response/raise_error.rb +49 -14
  53. data/lib/faraday/utils.rb +38 -247
  54. data/lib/faraday/utils/headers.rb +139 -0
  55. data/lib/faraday/utils/params_hash.rb +61 -0
  56. data/lib/faraday/version.rb +5 -0
  57. data/spec/external_adapters/faraday_specs_setup.rb +14 -0
  58. data/spec/faraday/adapter/em_http_spec.rb +47 -0
  59. data/spec/faraday/adapter/em_synchrony_spec.rb +16 -0
  60. data/spec/faraday/adapter/excon_spec.rb +49 -0
  61. data/spec/faraday/adapter/httpclient_spec.rb +73 -0
  62. data/spec/faraday/adapter/net_http_persistent_spec.rb +57 -0
  63. data/spec/faraday/adapter/net_http_spec.rb +64 -0
  64. data/spec/faraday/adapter/patron_spec.rb +18 -0
  65. data/spec/faraday/adapter/rack_spec.rb +8 -0
  66. data/spec/faraday/adapter/test_spec.rb +260 -0
  67. data/spec/faraday/adapter/typhoeus_spec.rb +7 -0
  68. data/spec/faraday/adapter_registry_spec.rb +28 -0
  69. data/spec/faraday/adapter_spec.rb +55 -0
  70. data/spec/faraday/composite_read_io_spec.rb +80 -0
  71. data/spec/faraday/connection_spec.rb +691 -0
  72. data/spec/faraday/error_spec.rb +60 -0
  73. data/spec/faraday/middleware_spec.rb +52 -0
  74. data/spec/faraday/options/env_spec.rb +70 -0
  75. data/spec/faraday/options/options_spec.rb +297 -0
  76. data/spec/faraday/options/proxy_options_spec.rb +37 -0
  77. data/spec/faraday/options/request_options_spec.rb +19 -0
  78. data/spec/faraday/params_encoders/flat_spec.rb +42 -0
  79. data/spec/faraday/params_encoders/nested_spec.rb +142 -0
  80. data/spec/faraday/rack_builder_spec.rb +345 -0
  81. data/spec/faraday/request/authorization_spec.rb +88 -0
  82. data/spec/faraday/request/instrumentation_spec.rb +76 -0
  83. data/spec/faraday/request/multipart_spec.rb +302 -0
  84. data/spec/faraday/request/retry_spec.rb +242 -0
  85. data/spec/faraday/request/url_encoded_spec.rb +83 -0
  86. data/spec/faraday/request_spec.rb +120 -0
  87. data/spec/faraday/response/logger_spec.rb +220 -0
  88. data/spec/faraday/response/middleware_spec.rb +68 -0
  89. data/spec/faraday/response/raise_error_spec.rb +169 -0
  90. data/spec/faraday/response_spec.rb +75 -0
  91. data/spec/faraday/utils/headers_spec.rb +82 -0
  92. data/spec/faraday/utils_spec.rb +56 -0
  93. data/spec/faraday_spec.rb +37 -0
  94. data/spec/spec_helper.rb +132 -0
  95. data/spec/support/disabling_stub.rb +14 -0
  96. data/spec/support/fake_safe_buffer.rb +15 -0
  97. data/spec/support/helper_methods.rb +133 -0
  98. data/spec/support/shared_examples/adapter.rb +105 -0
  99. data/spec/support/shared_examples/params_encoder.rb +18 -0
  100. data/spec/support/shared_examples/request_method.rb +262 -0
  101. data/spec/support/streaming_response_checker.rb +35 -0
  102. data/spec/support/webmock_rack_app.rb +68 -0
  103. metadata +109 -10
  104. data/lib/faraday/adapter/net_http.rb +0 -152
  105. data/lib/faraday/upload_io.rb +0 -67
@@ -1,152 +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
- IOError,
14
- Errno::ECONNABORTED,
15
- Errno::ECONNREFUSED,
16
- Errno::ECONNRESET,
17
- Errno::EHOSTUNREACH,
18
- Errno::EINVAL,
19
- Errno::ENETUNREACH,
20
- Errno::EPIPE,
21
- Net::HTTPBadResponse,
22
- Net::HTTPHeaderSyntaxError,
23
- Net::ProtocolError,
24
- SocketError,
25
- Zlib::GzipFile::Error,
26
- ]
27
-
28
- NET_HTTP_EXCEPTIONS << OpenSSL::SSL::SSLError if defined?(OpenSSL)
29
- NET_HTTP_EXCEPTIONS << Net::OpenTimeout if defined?(Net::OpenTimeout)
30
-
31
- def initialize(app = nil, opts = {}, &block)
32
- @cert_store = nil
33
- super(app, opts, &block)
34
- end
35
-
36
- def call(env)
37
- super
38
- with_net_http_connection(env) do |http|
39
- configure_ssl(http, env[:ssl]) if env[:url].scheme == 'https' and env[:ssl]
40
- configure_request(http, env[:request])
41
-
42
- begin
43
- http_response = perform_request(http, env)
44
- rescue *NET_HTTP_EXCEPTIONS => err
45
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
46
- raise Faraday::SSLError, err
47
- else
48
- raise Error::ConnectionFailed, err
49
- end
50
- end
51
-
52
- save_response(env, http_response.code.to_i, http_response.body || '', nil, http_response.message) do |response_headers|
53
- http_response.each_header do |key, value|
54
- response_headers[key] = value
55
- end
56
- end
57
- end
58
-
59
- @app.call env
60
- rescue Timeout::Error, Errno::ETIMEDOUT => err
61
- raise Faraday::Error::TimeoutError, err
62
- end
63
-
64
- private
65
-
66
- def create_request(env)
67
- request = Net::HTTPGenericRequest.new \
68
- env[:method].to_s.upcase, # request method
69
- !!env[:body], # is there request body
70
- :head != env[:method], # is there response body
71
- env[:url].request_uri, # request uri path
72
- env[:request_headers] # request headers
73
-
74
- if env[:body].respond_to?(:read)
75
- request.body_stream = env[:body]
76
- else
77
- request.body = env[:body]
78
- end
79
- request
80
- end
81
-
82
- def perform_request(http, env)
83
- if :get == env[:method] and !env[:body]
84
- # prefer `get` to `request` because the former handles gzip (ruby 1.9)
85
- http.get env[:url].request_uri, env[:request_headers]
86
- else
87
- http.request create_request(env)
88
- end
89
- end
90
-
91
- def with_net_http_connection(env)
92
- yield net_http_connection(env)
93
- end
94
-
95
- def net_http_connection(env)
96
- if proxy = env[:request][:proxy]
97
- Net::HTTP::Proxy(proxy[:uri].hostname, proxy[:uri].port, proxy[:user], proxy[:password])
98
- else
99
- Net::HTTP
100
- end.new(env[:url].hostname, env[:url].port || (env[:url].scheme == 'https' ? 443 : 80))
101
- end
102
-
103
- def configure_ssl(http, ssl)
104
- http.use_ssl = true
105
- http.verify_mode = ssl_verify_mode(ssl)
106
- http.cert_store = ssl_cert_store(ssl)
107
-
108
- http.cert = ssl[:client_cert] if ssl[:client_cert]
109
- http.key = ssl[:client_key] if ssl[:client_key]
110
- http.ca_file = ssl[:ca_file] if ssl[:ca_file]
111
- http.ca_path = ssl[:ca_path] if ssl[:ca_path]
112
- http.verify_depth = ssl[:verify_depth] if ssl[:verify_depth]
113
- http.ssl_version = ssl[:version] if ssl[:version]
114
- http.min_version = ssl[:min_version] if ssl[:min_version]
115
- http.max_version = ssl[:max_version] if ssl[:max_version]
116
- end
117
-
118
- def configure_request(http, req)
119
- if req[:timeout]
120
- http.read_timeout = req[:timeout]
121
- http.open_timeout = req[:timeout]
122
- http.write_timeout = req[:timeout] if http.respond_to?(:write_timeout=)
123
- end
124
- http.open_timeout = req[:open_timeout] if req[:open_timeout]
125
- http.write_timeout = req[:write_timeout] if req[:write_timeout] && http.respond_to?(:write_timeout=)
126
- # Only set if Net::Http supports it, since Ruby 2.5.
127
- http.max_retries = 0 if http.respond_to?(:max_retries=)
128
-
129
- @config_block.call(http) if @config_block
130
- end
131
-
132
- def ssl_cert_store(ssl)
133
- return ssl[:cert_store] if ssl[:cert_store]
134
- return @cert_store if @cert_store
135
- # Use the default cert store by default, i.e. system ca certs
136
- @cert_store = OpenSSL::X509::Store.new
137
- @cert_store.set_default_paths
138
- @cert_store
139
- end
140
-
141
- def ssl_verify_mode(ssl)
142
- ssl[:verify_mode] || begin
143
- if ssl.fetch(:verify, true)
144
- OpenSSL::SSL::VERIFY_PEER
145
- else
146
- OpenSSL::SSL::VERIFY_NONE
147
- end
148
- end
149
- end
150
- end
151
- end
152
- end
@@ -1,67 +0,0 @@
1
- begin
2
- require 'composite_io'
3
- require 'parts'
4
- require 'stringio'
5
- rescue LoadError
6
- $stderr.puts "Install the multipart-post gem."
7
- raise
8
- end
9
-
10
- module Faraday
11
- # Similar but not compatible with ::CompositeReadIO provided by multipart-post.
12
- class CompositeReadIO
13
- def initialize(*parts)
14
- @parts = parts.flatten
15
- @ios = @parts.map { |part| part.to_io }
16
- @index = 0
17
- end
18
-
19
- def length
20
- @parts.inject(0) { |sum, part| sum + part.length }
21
- end
22
-
23
- def rewind
24
- @ios.each { |io| io.rewind }
25
- @index = 0
26
- end
27
-
28
- # Read from IOs in order until `length` bytes have been received.
29
- def read(length = nil, outbuf = nil)
30
- got_result = false
31
- outbuf = outbuf ? outbuf.replace("") : ""
32
-
33
- while io = current_io
34
- if result = io.read(length)
35
- got_result ||= !result.nil?
36
- result.force_encoding("BINARY") if result.respond_to?(:force_encoding)
37
- outbuf << result
38
- length -= result.length if length
39
- break if length == 0
40
- end
41
- advance_io
42
- end
43
- (!got_result && length) ? nil : outbuf
44
- end
45
-
46
- def close
47
- @ios.each { |io| io.close }
48
- end
49
-
50
- def ensure_open_and_readable
51
- # Rubinius compatibility
52
- end
53
-
54
- private
55
-
56
- def current_io
57
- @ios[@index]
58
- end
59
-
60
- def advance_io
61
- @index += 1
62
- end
63
- end
64
-
65
- UploadIO = ::UploadIO
66
- Parts = ::Parts
67
- end