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
metadata CHANGED
@@ -1,185 +1,157 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: faraday
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 2.5.2
5
5
  platform: ruby
6
6
  authors:
7
- - Rick Olson
7
+ - "@technoweenie"
8
+ - "@iMacTia"
9
+ - "@olleolleolle"
8
10
  autorequire:
9
11
  bindir: bin
10
12
  cert_chain: []
11
- date: 2015-01-07 00:00:00.000000000 Z
13
+ date: 2022-08-11 00:00:00.000000000 Z
12
14
  dependencies:
13
15
  - !ruby/object:Gem::Dependency
14
- name: multipart-post
16
+ name: faraday-net_http
15
17
  requirement: !ruby/object:Gem::Requirement
16
18
  requirements:
17
19
  - - ">="
18
20
  - !ruby/object:Gem::Version
19
- version: '1.2'
21
+ version: '2.0'
20
22
  - - "<"
21
23
  - !ruby/object:Gem::Version
22
- version: '3'
24
+ version: '3.1'
23
25
  type: :runtime
24
26
  prerelease: false
25
27
  version_requirements: !ruby/object:Gem::Requirement
26
28
  requirements:
27
29
  - - ">="
28
30
  - !ruby/object:Gem::Version
29
- version: '1.2'
31
+ version: '2.0'
30
32
  - - "<"
31
33
  - !ruby/object:Gem::Version
32
- version: '3'
34
+ version: '3.1'
33
35
  - !ruby/object:Gem::Dependency
34
- name: bundler
36
+ name: ruby2_keywords
35
37
  requirement: !ruby/object:Gem::Requirement
36
38
  requirements:
37
- - - "~>"
39
+ - - ">="
38
40
  - !ruby/object:Gem::Version
39
- version: '1.0'
40
- type: :development
41
+ version: 0.0.4
42
+ type: :runtime
41
43
  prerelease: false
42
44
  version_requirements: !ruby/object:Gem::Requirement
43
45
  requirements:
44
- - - "~>"
46
+ - - ">="
45
47
  - !ruby/object:Gem::Version
46
- version: '1.0'
48
+ version: 0.0.4
47
49
  description:
48
50
  email: technoweenie@gmail.com
49
51
  executables: []
50
52
  extensions: []
51
53
  extra_rdoc_files: []
52
54
  files:
53
- - ".document"
54
55
  - CHANGELOG.md
55
- - CONTRIBUTING.md
56
- - Gemfile
57
56
  - LICENSE.md
58
57
  - README.md
59
58
  - Rakefile
60
- - faraday.gemspec
59
+ - examples/client_spec.rb
60
+ - examples/client_test.rb
61
61
  - lib/faraday.rb
62
62
  - lib/faraday/adapter.rb
63
- - lib/faraday/adapter/em_http.rb
64
- - lib/faraday/adapter/em_http_ssl_patch.rb
65
- - lib/faraday/adapter/em_synchrony.rb
66
- - lib/faraday/adapter/em_synchrony/parallel_manager.rb
67
- - lib/faraday/adapter/excon.rb
68
- - lib/faraday/adapter/httpclient.rb
69
- - lib/faraday/adapter/net_http.rb
70
- - lib/faraday/adapter/net_http_persistent.rb
71
- - lib/faraday/adapter/patron.rb
72
- - lib/faraday/adapter/rack.rb
73
63
  - lib/faraday/adapter/test.rb
74
- - lib/faraday/adapter/typhoeus.rb
75
- - lib/faraday/autoload.rb
64
+ - lib/faraday/adapter_registry.rb
76
65
  - lib/faraday/connection.rb
66
+ - lib/faraday/encoders/flat_params_encoder.rb
67
+ - lib/faraday/encoders/nested_params_encoder.rb
77
68
  - lib/faraday/error.rb
69
+ - lib/faraday/logging/formatter.rb
70
+ - lib/faraday/methods.rb
78
71
  - lib/faraday/middleware.rb
72
+ - lib/faraday/middleware_registry.rb
79
73
  - lib/faraday/options.rb
74
+ - lib/faraday/options/connection_options.rb
75
+ - lib/faraday/options/env.rb
76
+ - lib/faraday/options/proxy_options.rb
77
+ - lib/faraday/options/request_options.rb
78
+ - lib/faraday/options/ssl_options.rb
80
79
  - lib/faraday/parameters.rb
81
80
  - lib/faraday/rack_builder.rb
82
81
  - lib/faraday/request.rb
83
82
  - lib/faraday/request/authorization.rb
84
- - lib/faraday/request/basic_authentication.rb
85
83
  - lib/faraday/request/instrumentation.rb
86
- - lib/faraday/request/multipart.rb
87
- - lib/faraday/request/retry.rb
88
- - lib/faraday/request/token_authentication.rb
84
+ - lib/faraday/request/json.rb
89
85
  - lib/faraday/request/url_encoded.rb
90
86
  - lib/faraday/response.rb
87
+ - lib/faraday/response/json.rb
91
88
  - lib/faraday/response/logger.rb
92
89
  - lib/faraday/response/raise_error.rb
93
- - lib/faraday/upload_io.rb
94
90
  - lib/faraday/utils.rb
95
- - script/cached-bundle
96
- - script/console
97
- - script/generate_certs
98
- - script/package
99
- - script/proxy-server
100
- - script/release
101
- - script/s3-put
102
- - script/server
103
- - script/test
104
- - test/adapters/default_test.rb
105
- - test/adapters/em_http_test.rb
106
- - test/adapters/em_synchrony_test.rb
107
- - test/adapters/excon_test.rb
108
- - test/adapters/httpclient_test.rb
109
- - test/adapters/integration.rb
110
- - test/adapters/logger_test.rb
111
- - test/adapters/net_http_persistent_test.rb
112
- - test/adapters/net_http_test.rb
113
- - test/adapters/patron_test.rb
114
- - test/adapters/rack_test.rb
115
- - test/adapters/test_middleware_test.rb
116
- - test/adapters/typhoeus_test.rb
117
- - test/authentication_middleware_test.rb
118
- - test/composite_read_io_test.rb
119
- - test/connection_test.rb
120
- - test/env_test.rb
121
- - test/helper.rb
122
- - test/live_server.rb
123
- - test/middleware/instrumentation_test.rb
124
- - test/middleware/retry_test.rb
125
- - test/middleware_stack_test.rb
126
- - test/multibyte.txt
127
- - test/options_test.rb
128
- - test/parameters_test.rb
129
- - test/request_middleware_test.rb
130
- - test/response_middleware_test.rb
131
- - test/strawberry.rb
132
- - test/utils_test.rb
133
- homepage: https://github.com/lostisland/faraday
91
+ - lib/faraday/utils/headers.rb
92
+ - lib/faraday/utils/params_hash.rb
93
+ - lib/faraday/version.rb
94
+ - spec/external_adapters/faraday_specs_setup.rb
95
+ - spec/faraday/adapter/test_spec.rb
96
+ - spec/faraday/adapter_registry_spec.rb
97
+ - spec/faraday/adapter_spec.rb
98
+ - spec/faraday/connection_spec.rb
99
+ - spec/faraday/error_spec.rb
100
+ - spec/faraday/middleware_registry_spec.rb
101
+ - spec/faraday/middleware_spec.rb
102
+ - spec/faraday/options/env_spec.rb
103
+ - spec/faraday/options/options_spec.rb
104
+ - spec/faraday/options/proxy_options_spec.rb
105
+ - spec/faraday/options/request_options_spec.rb
106
+ - spec/faraday/params_encoders/flat_spec.rb
107
+ - spec/faraday/params_encoders/nested_spec.rb
108
+ - spec/faraday/rack_builder_spec.rb
109
+ - spec/faraday/request/authorization_spec.rb
110
+ - spec/faraday/request/instrumentation_spec.rb
111
+ - spec/faraday/request/json_spec.rb
112
+ - spec/faraday/request/url_encoded_spec.rb
113
+ - spec/faraday/request_spec.rb
114
+ - spec/faraday/response/json_spec.rb
115
+ - spec/faraday/response/logger_spec.rb
116
+ - spec/faraday/response/raise_error_spec.rb
117
+ - spec/faraday/response_spec.rb
118
+ - spec/faraday/utils/headers_spec.rb
119
+ - spec/faraday/utils_spec.rb
120
+ - spec/faraday_spec.rb
121
+ - spec/spec_helper.rb
122
+ - spec/support/disabling_stub.rb
123
+ - spec/support/fake_safe_buffer.rb
124
+ - spec/support/helper_methods.rb
125
+ - spec/support/shared_examples/adapter.rb
126
+ - spec/support/shared_examples/params_encoder.rb
127
+ - spec/support/shared_examples/request_method.rb
128
+ - spec/support/streaming_response_checker.rb
129
+ homepage: https://lostisland.github.io/faraday
134
130
  licenses:
135
131
  - MIT
136
- metadata: {}
132
+ metadata:
133
+ homepage_uri: https://lostisland.github.io/faraday
134
+ changelog_uri: https://github.com/lostisland/faraday/releases/tag/v2.5.2
135
+ source_code_uri: https://github.com/lostisland/faraday
136
+ bug_tracker_uri: https://github.com/lostisland/faraday/issues
137
137
  post_install_message:
138
138
  rdoc_options: []
139
139
  require_paths:
140
140
  - lib
141
+ - spec/external_adapters
141
142
  required_ruby_version: !ruby/object:Gem::Requirement
142
143
  requirements:
143
144
  - - ">="
144
145
  - !ruby/object:Gem::Version
145
- version: '0'
146
+ version: '2.6'
146
147
  required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  requirements:
148
149
  - - ">="
149
150
  - !ruby/object:Gem::Version
150
- version: 1.3.5
151
+ version: '0'
151
152
  requirements: []
152
- rubyforge_project:
153
- rubygems_version: 2.2.2
153
+ rubygems_version: 3.1.6
154
154
  signing_key:
155
- specification_version: 2
155
+ specification_version: 4
156
156
  summary: HTTP/REST API client library.
157
- test_files:
158
- - test/adapters/default_test.rb
159
- - test/adapters/em_http_test.rb
160
- - test/adapters/em_synchrony_test.rb
161
- - test/adapters/excon_test.rb
162
- - test/adapters/httpclient_test.rb
163
- - test/adapters/integration.rb
164
- - test/adapters/logger_test.rb
165
- - test/adapters/net_http_persistent_test.rb
166
- - test/adapters/net_http_test.rb
167
- - test/adapters/patron_test.rb
168
- - test/adapters/rack_test.rb
169
- - test/adapters/test_middleware_test.rb
170
- - test/adapters/typhoeus_test.rb
171
- - test/authentication_middleware_test.rb
172
- - test/composite_read_io_test.rb
173
- - test/connection_test.rb
174
- - test/env_test.rb
175
- - test/helper.rb
176
- - test/live_server.rb
177
- - test/middleware/instrumentation_test.rb
178
- - test/middleware/retry_test.rb
179
- - test/middleware_stack_test.rb
180
- - test/options_test.rb
181
- - test/parameters_test.rb
182
- - test/request_middleware_test.rb
183
- - test/response_middleware_test.rb
184
- - test/strawberry.rb
185
- - test/utils_test.rb
157
+ test_files: []
data/.document DELETED
@@ -1,6 +0,0 @@
1
- CONTRIBUTING.md
2
- LICENSE.md
3
- README.md
4
- bin/*
5
- lib/**/*.rb
6
- test/**/*.rb
data/CONTRIBUTING.md DELETED
@@ -1,36 +0,0 @@
1
- ## Contributing
2
-
3
- You can run the test suite against a live server by running `script/test`. It
4
- automatically starts a test server in background. Only tests in
5
- `test/adapters/*_test.rb` require a server, though.
6
-
7
- ``` sh
8
- # run the whole suite
9
- $ script/test
10
-
11
- # run only specific files
12
- $ script/test excon typhoeus
13
-
14
- # run tests using SSL
15
- $ SSL=yes script/test
16
- ```
17
-
18
- We will accept middleware that:
19
-
20
- 1. is useful to a broader audience, but can be implemented relatively
21
- simple; and
22
- 2. which isn't already present in [faraday_middleware][] project.
23
-
24
- We will accept adapters that:
25
-
26
- 1. support SSL & streaming;
27
- 1. are proven and may have better performance than existing ones; or
28
- 2. if they have features not present in included adapters.
29
-
30
- We are pushing towards a 1.0 release, when we will have to follow [Semantic
31
- Versioning][semver]. If your patch includes changes to break compatibility,
32
- note that so we can add it to the [Changelog][].
33
-
34
- [semver]: http://semver.org/
35
- [changelog]: https://github.com/lostisland/faraday/wiki/Changelog
36
- [faraday_middleware]: https://github.com/lostisland/faraday_middleware/wiki
data/Gemfile DELETED
@@ -1,25 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'ffi-ncurses', '~> 0.3', :platforms => :jruby
4
- gem 'jruby-openssl', '~> 0.8.8', :platforms => :jruby
5
- gem 'rake'
6
-
7
- group :test do
8
- gem 'coveralls', :require => false
9
- gem 'em-http-request', '>= 1.1', :require => 'em-http'
10
- gem 'em-synchrony', '>= 1.0.3', :require => ['em-synchrony', 'em-synchrony/em-http']
11
- gem 'excon', '>= 0.27.4'
12
- gem 'httpclient', '>= 2.2'
13
- gem 'leftright', '>= 0.9', :require => false
14
- gem 'mime-types', '~> 1.25', :platforms => [:jruby, :ruby_18]
15
- gem 'minitest', '>= 5.0.5'
16
- gem 'net-http-persistent', '>= 2.9.4'
17
- gem 'patron', '>= 0.4.2', :platforms => :ruby
18
- gem 'rack-test', '>= 0.6', :require => 'rack/test'
19
- gem 'rest-client', '~> 1.6.0', :platforms => [:jruby, :ruby_18]
20
- gem 'simplecov'
21
- gem 'sinatra', '~> 1.3'
22
- gem 'typhoeus', '~> 0.3.3', :platforms => :ruby
23
- end
24
-
25
- gemspec
data/faraday.gemspec DELETED
@@ -1,34 +0,0 @@
1
- lib = "faraday"
2
- lib_file = File.expand_path("../lib/#{lib}.rb", __FILE__)
3
- File.read(lib_file) =~ /\bVERSION\s*=\s*["'](.+?)["']/
4
- version = $1
5
-
6
- Gem::Specification.new do |spec|
7
- spec.specification_version = 2 if spec.respond_to? :specification_version=
8
- spec.required_rubygems_version = '>= 1.3.5'
9
-
10
- spec.name = lib
11
- spec.version = version
12
-
13
- spec.summary = "HTTP/REST API client library."
14
-
15
- spec.authors = ["Rick Olson"]
16
- spec.email = 'technoweenie@gmail.com'
17
- spec.homepage = 'https://github.com/lostisland/faraday'
18
- spec.licenses = ['MIT']
19
-
20
- spec.add_dependency 'multipart-post', '>= 1.2', '< 3'
21
- spec.add_development_dependency 'bundler', '~> 1.0'
22
-
23
- spec.files = %w(.document CHANGELOG.md CONTRIBUTING.md Gemfile LICENSE.md README.md Rakefile)
24
- spec.files << "#{lib}.gemspec"
25
- spec.files += Dir.glob("lib/**/*.rb")
26
- spec.files += Dir.glob("test/**/*.{rb,txt}")
27
- spec.files += Dir.glob("script/*")
28
-
29
- dev_null = File.exist?('/dev/null') ? '/dev/null' : 'NUL'
30
- git_files = `git ls-files -z 2>#{dev_null}`
31
- spec.files &= git_files.split("\0") if $?.success?
32
-
33
- spec.test_files = Dir.glob("test/**/*.rb")
34
- end
@@ -1,237 +0,0 @@
1
- module Faraday
2
- class Adapter
3
- # EventMachine adapter is useful for either asynchronous requests
4
- # when in EM reactor loop or for making parallel requests in
5
- # synchronous code.
6
- class EMHttp < Faraday::Adapter
7
- module Options
8
- def connection_config(env)
9
- options = {}
10
- configure_proxy(options, env)
11
- configure_timeout(options, env)
12
- configure_socket(options, env)
13
- configure_ssl(options, env)
14
- options
15
- end
16
-
17
- def request_config(env)
18
- options = {
19
- :body => read_body(env),
20
- :head => env[:request_headers],
21
- # :keepalive => true,
22
- # :file => 'path/to/file', # stream data off disk
23
- }
24
- configure_compression(options, env)
25
- options
26
- end
27
-
28
- def read_body(env)
29
- body = env[:body]
30
- body.respond_to?(:read) ? body.read : body
31
- end
32
-
33
- def configure_proxy(options, env)
34
- if proxy = request_options(env)[:proxy]
35
- options[:proxy] = {
36
- :host => proxy[:uri].host,
37
- :port => proxy[:uri].port,
38
- :authorization => [proxy[:user], proxy[:password]]
39
- }
40
- end
41
- end
42
-
43
- def configure_socket(options, env)
44
- if bind = request_options(env)[:bind]
45
- options[:bind] = {
46
- :host => bind[:host],
47
- :port => bind[:port]
48
- }
49
- end
50
- end
51
-
52
- def configure_ssl(options, env)
53
- if env[:url].scheme == 'https' && env[:ssl]
54
- options[:ssl] = {
55
- :cert_chain_file => env[:ssl][:ca_file],
56
- :verify_peer => env[:ssl].fetch(:verify, true)
57
- }
58
- end
59
- end
60
-
61
- def configure_timeout(options, env)
62
- timeout, open_timeout = request_options(env).values_at(:timeout, :open_timeout)
63
- options[:connect_timeout] = options[:inactivity_timeout] = timeout
64
- options[:connect_timeout] = open_timeout if open_timeout
65
- end
66
-
67
- def configure_compression(options, env)
68
- if env[:method] == :get and not options[:head].key? 'accept-encoding'
69
- options[:head]['accept-encoding'] = 'gzip, compressed'
70
- end
71
- end
72
-
73
- def request_options(env)
74
- env[:request]
75
- end
76
- end
77
-
78
- include Options
79
-
80
- dependency 'em-http'
81
-
82
- self.supports_parallel = true
83
-
84
- def self.setup_parallel_manager(options = nil)
85
- Manager.new
86
- end
87
-
88
- def call(env)
89
- super
90
- perform_request env
91
- @app.call env
92
- end
93
-
94
- def perform_request(env)
95
- if parallel?(env)
96
- manager = env[:parallel_manager]
97
- manager.add {
98
- perform_single_request(env).
99
- callback { env[:response].finish(env) }
100
- }
101
- else
102
- unless EventMachine.reactor_running?
103
- error = nil
104
- # start EM, block until request is completed
105
- EventMachine.run do
106
- perform_single_request(env).
107
- callback { EventMachine.stop }.
108
- errback { |client|
109
- error = error_message(client)
110
- EventMachine.stop
111
- }
112
- end
113
- raise_error(error) if error
114
- else
115
- # EM is running: instruct upstream that this is an async request
116
- env[:parallel_manager] = true
117
- perform_single_request(env).
118
- callback { env[:response].finish(env) }.
119
- errback {
120
- # TODO: no way to communicate the error in async mode
121
- raise NotImplementedError
122
- }
123
- end
124
- end
125
- rescue EventMachine::Connectify::CONNECTError => err
126
- if err.message.include?("Proxy Authentication Required")
127
- raise Error::ConnectionFailed, %{407 "Proxy Authentication Required "}
128
- else
129
- raise Error::ConnectionFailed, err
130
- end
131
- rescue => err
132
- if defined?(OpenSSL) && OpenSSL::SSL::SSLError === err
133
- raise Faraday::SSLError, err
134
- else
135
- raise
136
- end
137
- end
138
-
139
- # TODO: reuse the connection to support pipelining
140
- def perform_single_request(env)
141
- req = EventMachine::HttpRequest.new(env[:url], connection_config(env))
142
- req.setup_request(env[:method], request_config(env)).callback { |client|
143
- save_response(env, client.response_header.status, client.response) do |resp_headers|
144
- client.response_header.each do |name, value|
145
- resp_headers[name.to_sym] = value
146
- end
147
- end
148
- }
149
- end
150
-
151
- def error_message(client)
152
- client.error or "request failed"
153
- end
154
-
155
- def raise_error(msg)
156
- errklass = Faraday::Error::ClientError
157
- if msg == Errno::ETIMEDOUT
158
- errklass = Faraday::Error::TimeoutError
159
- msg = "request timed out"
160
- elsif msg == Errno::ECONNREFUSED
161
- errklass = Faraday::Error::ConnectionFailed
162
- msg = "connection refused"
163
- elsif msg == "connection closed by server"
164
- errklass = Faraday::Error::ConnectionFailed
165
- end
166
- raise errklass, msg
167
- end
168
-
169
- def parallel?(env)
170
- !!env[:parallel_manager]
171
- end
172
-
173
- # The parallel manager is designed to start an EventMachine loop
174
- # and block until all registered requests have been completed.
175
- class Manager
176
- def initialize
177
- reset
178
- end
179
-
180
- def reset
181
- @registered_procs = []
182
- @num_registered = 0
183
- @num_succeeded = 0
184
- @errors = []
185
- @running = false
186
- end
187
-
188
- def running?() @running end
189
-
190
- def add
191
- if running?
192
- perform_request { yield }
193
- else
194
- @registered_procs << Proc.new
195
- end
196
- @num_registered += 1
197
- end
198
-
199
- def run
200
- if @num_registered > 0
201
- @running = true
202
- EventMachine.run do
203
- @registered_procs.each do |proc|
204
- perform_request(&proc)
205
- end
206
- end
207
- if @errors.size > 0
208
- raise Faraday::Error::ClientError, @errors.first || "connection failed"
209
- end
210
- end
211
- ensure
212
- reset
213
- end
214
-
215
- def perform_request
216
- client = yield
217
- client.callback { @num_succeeded += 1; check_finished }
218
- client.errback { @errors << client.error; check_finished }
219
- end
220
-
221
- def check_finished
222
- if @num_succeeded + @errors.size == @num_registered
223
- EventMachine.stop
224
- end
225
- end
226
- end
227
- end
228
- end
229
- end
230
-
231
- begin
232
- require 'openssl'
233
- rescue LoadError
234
- warn "Warning: no such file to load -- openssl. Make sure it is installed if you want HTTPS support"
235
- else
236
- require 'faraday/adapter/em_http_ssl_patch'
237
- end if Faraday::Adapter::EMHttp.loaded?
@@ -1,56 +0,0 @@
1
- require 'openssl'
2
- require 'em-http'
3
-
4
- module EmHttpSslPatch
5
- def ssl_verify_peer(cert_string)
6
- cert = nil
7
- begin
8
- cert = OpenSSL::X509::Certificate.new(cert_string)
9
- rescue OpenSSL::X509::CertificateError
10
- return false
11
- end
12
-
13
- @last_seen_cert = cert
14
-
15
- if certificate_store.verify(@last_seen_cert)
16
- begin
17
- certificate_store.add_cert(@last_seen_cert)
18
- rescue OpenSSL::X509::StoreError => e
19
- raise e unless e.message == 'cert already in hash table'
20
- end
21
- true
22
- else
23
- raise OpenSSL::SSL::SSLError.new(%(unable to verify the server certificate for "#{host}"))
24
- end
25
- end
26
-
27
- def ssl_handshake_completed
28
- return true unless verify_peer?
29
-
30
- unless OpenSSL::SSL.verify_certificate_identity(@last_seen_cert, host)
31
- raise OpenSSL::SSL::SSLError.new(%(host "#{host}" does not match the server certificate))
32
- else
33
- true
34
- end
35
- end
36
-
37
- def verify_peer?
38
- parent.connopts.tls[:verify_peer]
39
- end
40
-
41
- def host
42
- parent.connopts.host
43
- end
44
-
45
- def certificate_store
46
- @certificate_store ||= begin
47
- store = OpenSSL::X509::Store.new
48
- store.set_default_paths
49
- ca_file = parent.connopts.tls[:cert_chain_file]
50
- store.add_file(ca_file) if ca_file
51
- store
52
- end
53
- end
54
- end
55
-
56
- EventMachine::HttpStubConnection.send(:include, EmHttpSslPatch)