webmock 3.0.1 → 3.20.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 (138) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +558 -2
  3. data/README.md +200 -42
  4. data/lib/webmock/api.rb +14 -0
  5. data/lib/webmock/assertion_failure.rb +2 -0
  6. data/lib/webmock/callback_registry.rb +2 -0
  7. data/lib/webmock/config.rb +2 -0
  8. data/lib/webmock/cucumber.rb +2 -0
  9. data/lib/webmock/deprecation.rb +2 -0
  10. data/lib/webmock/errors.rb +2 -0
  11. data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +223 -0
  12. data/lib/webmock/http_lib_adapters/curb_adapter.rb +21 -5
  13. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +20 -9
  14. data/lib/webmock/http_lib_adapters/excon_adapter.rb +7 -2
  15. data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +2 -0
  16. data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +2 -0
  17. data/lib/webmock/http_lib_adapters/http_rb/client.rb +4 -1
  18. data/lib/webmock/http_lib_adapters/http_rb/request.rb +19 -1
  19. data/lib/webmock/http_lib_adapters/http_rb/response.rb +29 -3
  20. data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +11 -3
  21. data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +9 -3
  22. data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +2 -0
  23. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +30 -9
  24. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +35 -15
  25. data/lib/webmock/http_lib_adapters/net_http.rb +38 -89
  26. data/lib/webmock/http_lib_adapters/net_http_response.rb +3 -1
  27. data/lib/webmock/http_lib_adapters/patron_adapter.rb +6 -4
  28. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
  29. data/lib/webmock/matchers/any_arg_matcher.rb +15 -0
  30. data/lib/webmock/matchers/hash_argument_matcher.rb +23 -0
  31. data/lib/webmock/matchers/hash_excluding_matcher.rb +17 -0
  32. data/lib/webmock/matchers/hash_including_matcher.rb +6 -23
  33. data/lib/webmock/minitest.rb +2 -0
  34. data/lib/webmock/rack_response.rb +3 -1
  35. data/lib/webmock/request_body_diff.rb +3 -1
  36. data/lib/webmock/request_execution_verifier.rb +4 -3
  37. data/lib/webmock/request_pattern.rb +132 -52
  38. data/lib/webmock/request_registry.rb +3 -1
  39. data/lib/webmock/request_signature.rb +5 -3
  40. data/lib/webmock/request_signature_snippet.rb +6 -4
  41. data/lib/webmock/request_stub.rb +34 -0
  42. data/lib/webmock/response.rb +22 -14
  43. data/lib/webmock/responses_sequence.rb +2 -0
  44. data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +2 -0
  45. data/lib/webmock/rspec/matchers/webmock_matcher.rb +2 -0
  46. data/lib/webmock/rspec/matchers.rb +2 -0
  47. data/lib/webmock/rspec.rb +12 -3
  48. data/lib/webmock/stub_registry.rb +28 -11
  49. data/lib/webmock/stub_request_snippet.rb +12 -6
  50. data/lib/webmock/test_unit.rb +3 -3
  51. data/lib/webmock/util/hash_counter.rb +15 -9
  52. data/lib/webmock/util/hash_keys_stringifier.rb +2 -0
  53. data/lib/webmock/util/hash_validator.rb +2 -0
  54. data/lib/webmock/util/headers.rb +39 -11
  55. data/lib/webmock/util/json.rb +3 -2
  56. data/lib/webmock/util/query_mapper.rb +11 -7
  57. data/lib/webmock/util/uri.rb +13 -11
  58. data/lib/webmock/util/values_stringifier.rb +22 -0
  59. data/lib/webmock/util/version_checker.rb +7 -5
  60. data/lib/webmock/version.rb +3 -1
  61. data/lib/webmock/webmock.rb +22 -3
  62. data/lib/webmock.rb +55 -48
  63. metadata +106 -175
  64. data/.gemtest +0 -0
  65. data/.gitignore +0 -34
  66. data/.rspec-tm +0 -2
  67. data/.travis.yml +0 -20
  68. data/Gemfile +0 -9
  69. data/Rakefile +0 -30
  70. data/minitest/test_helper.rb +0 -34
  71. data/minitest/test_webmock.rb +0 -9
  72. data/minitest/webmock_spec.rb +0 -60
  73. data/spec/acceptance/curb/curb_spec.rb +0 -466
  74. data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
  75. data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -406
  76. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
  77. data/spec/acceptance/excon/excon_spec.rb +0 -75
  78. data/spec/acceptance/excon/excon_spec_helper.rb +0 -50
  79. data/spec/acceptance/http_rb/http_rb_spec.rb +0 -73
  80. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -51
  81. data/spec/acceptance/httpclient/httpclient_spec.rb +0 -210
  82. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
  83. data/spec/acceptance/manticore/manticore_spec.rb +0 -56
  84. data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
  85. data/spec/acceptance/net_http/net_http_shared.rb +0 -153
  86. data/spec/acceptance/net_http/net_http_spec.rb +0 -317
  87. data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
  88. data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
  89. data/spec/acceptance/patron/patron_spec.rb +0 -118
  90. data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
  91. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
  92. data/spec/acceptance/shared/callbacks.rb +0 -147
  93. data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
  94. data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
  95. data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
  96. data/spec/acceptance/shared/request_expectations.rb +0 -916
  97. data/spec/acceptance/shared/returning_declared_responses.rb +0 -388
  98. data/spec/acceptance/shared/stubbing_requests.rb +0 -583
  99. data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
  100. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
  101. data/spec/acceptance/webmock_shared.rb +0 -41
  102. data/spec/fixtures/test.txt +0 -1
  103. data/spec/quality_spec.rb +0 -84
  104. data/spec/spec_helper.rb +0 -48
  105. data/spec/support/example_curl_output.txt +0 -22
  106. data/spec/support/failures.rb +0 -9
  107. data/spec/support/my_rack_app.rb +0 -53
  108. data/spec/support/network_connection.rb +0 -19
  109. data/spec/support/webmock_server.rb +0 -69
  110. data/spec/unit/api_spec.rb +0 -75
  111. data/spec/unit/errors_spec.rb +0 -129
  112. data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
  113. data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
  114. data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
  115. data/spec/unit/rack_response_spec.rb +0 -112
  116. data/spec/unit/request_body_diff_spec.rb +0 -90
  117. data/spec/unit/request_execution_verifier_spec.rb +0 -208
  118. data/spec/unit/request_pattern_spec.rb +0 -590
  119. data/spec/unit/request_registry_spec.rb +0 -95
  120. data/spec/unit/request_signature_snippet_spec.rb +0 -89
  121. data/spec/unit/request_signature_spec.rb +0 -155
  122. data/spec/unit/request_stub_spec.rb +0 -199
  123. data/spec/unit/response_spec.rb +0 -282
  124. data/spec/unit/stub_registry_spec.rb +0 -103
  125. data/spec/unit/stub_request_snippet_spec.rb +0 -95
  126. data/spec/unit/util/hash_counter_spec.rb +0 -39
  127. data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
  128. data/spec/unit/util/headers_spec.rb +0 -28
  129. data/spec/unit/util/json_spec.rb +0 -33
  130. data/spec/unit/util/query_mapper_spec.rb +0 -144
  131. data/spec/unit/util/uri_spec.rb +0 -299
  132. data/spec/unit/util/version_checker_spec.rb +0 -65
  133. data/spec/unit/webmock_spec.rb +0 -11
  134. data/test/http_request.rb +0 -24
  135. data/test/shared_test.rb +0 -95
  136. data/test/test_helper.rb +0 -23
  137. data/test/test_webmock.rb +0 -6
  138. data/webmock.gemspec +0 -46
@@ -1,406 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
- require 'acceptance/webmock_shared'
4
- require 'ostruct'
5
-
6
- unless RUBY_PLATFORM =~ /java/
7
- require 'acceptance/em_http_request/em_http_request_spec_helper'
8
-
9
- describe "EM::HttpRequest" do
10
- include EMHttpRequestSpecHelper
11
-
12
- include_context "with WebMock", :no_status_message
13
-
14
- #functionality only supported for em-http-request 1.x
15
- if defined?(EventMachine::HttpConnection)
16
- context 'when a real request is made and redirects are followed', net_connect: true do
17
- before { WebMock.allow_net_connect! }
18
-
19
- # This url redirects to the https URL.
20
- let(:http_url) { "http://raw.github.com:80/gist/fb555cb593f3349d53af/6921dd638337d3f6a51b0e02e7f30e3c414f70d6/vcr_gist" }
21
- let(:https_url) { http_url.gsub('http', 'https').gsub('80', '443') }
22
-
23
- def make_request
24
- EM.run do
25
- request = EM::HttpRequest.new(http_url).get(redirects: 1)
26
- request.callback { EM.stop }
27
- end
28
- end
29
-
30
- it "invokes the globally_stub_request hook with both requests" do
31
- urls = []
32
- WebMock.globally_stub_request { |r| urls << r.uri.to_s; nil }
33
-
34
- make_request
35
-
36
- expect(urls).to eq([http_url, https_url])
37
- end
38
-
39
- it 'invokes the after_request hook with both requests' do
40
- urls = []
41
- WebMock.after_request { |req, res| urls << req.uri.to_s }
42
-
43
- make_request
44
-
45
- expect(urls).to eq([http_url, https_url])
46
- end
47
- end
48
-
49
- describe "with middleware" do
50
-
51
- it "should work with request middleware" do
52
- stub_request(:get, "www.example.com").with(body: 'bar')
53
-
54
- middleware = Class.new do
55
- def request(client, head, body)
56
- [{}, 'bar']
57
- end
58
- end
59
-
60
- EM.run do
61
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
62
-
63
- conn.use middleware
64
-
65
- http = conn.get(body: 'foo')
66
-
67
- http.callback do
68
- expect(WebMock).to have_requested(:get, "www.example.com").with(body: 'bar')
69
- EM.stop
70
- end
71
- end
72
- end
73
-
74
- let(:response_middleware) do
75
- Class.new do
76
- def response(resp)
77
- resp.response = 'bar'
78
- end
79
- end
80
- end
81
-
82
- it "should work with response middleware" do
83
- stub_request(:get, "www.example.com").to_return(body: 'foo')
84
-
85
- EM.run do
86
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
87
-
88
- conn.use response_middleware
89
-
90
- http = conn.get
91
-
92
- http.callback do
93
- expect(http.response).to eq('bar')
94
- EM.stop
95
- end
96
- end
97
- end
98
-
99
- let(:webmock_server_url) { "http://#{WebMockServer.instance.host_with_port}/" }
100
-
101
- shared_examples_for "em-http-request middleware/after_request hook integration" do
102
- it 'yields the original raw body to the after_request hook even if a response middleware modifies the body' do
103
- yielded_response_body = nil
104
- ::WebMock.after_request do |request, response|
105
- yielded_response_body = response.body
106
- end
107
-
108
- EM::HttpRequest.use response_middleware
109
-
110
- EM.run do
111
- http = EventMachine::HttpRequest.new(webmock_server_url).get
112
- http.callback { EM.stop }
113
- end
114
-
115
- expect(yielded_response_body).to eq("hello world")
116
- end
117
- end
118
-
119
- context 'making a real request', net_connect: true do
120
- before { WebMock.allow_net_connect! }
121
- include_examples "em-http-request middleware/after_request hook integration"
122
- end
123
-
124
- context 'when the request is stubbed' do
125
- before { stub_request(:get, webmock_server_url).to_return(body: 'hello world') }
126
- include_examples "em-http-request middleware/after_request hook integration"
127
- end
128
- end
129
-
130
- it 'should trigger error callbacks asynchronously' do
131
- stub_request(:get, 'www.example.com').to_timeout
132
- called = false
133
-
134
- EM.run do
135
- conn = EventMachine::HttpRequest.new('http://www.example.com/')
136
- http = conn.get
137
- http.errback do
138
- called = true
139
- EM.stop
140
- end
141
- expect(called).to eq(false)
142
- end
143
-
144
- expect(called).to eq(true)
145
- end
146
-
147
- # not pretty, but it works
148
- if defined?(EventMachine::Synchrony)
149
- describe "with synchrony" do
150
- let(:webmock_em_http) { File.expand_path(File.join(File.dirname(__FILE__), "../lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb")) }
151
-
152
- before(:each) do
153
- # need to reload the webmock em-http adapter after we require synchrony
154
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
155
- $".delete webmock_em_http
156
- $".delete File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
157
- require 'em-synchrony'
158
- require 'em-synchrony/em-http'
159
- require File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
160
- end
161
-
162
- it "should work" do
163
- stub_request(:post, /.*.testserver.com*/).to_return(status: 200, body: 'ok')
164
- expect {
165
- EM.run do
166
- fiber = Fiber.new do
167
- EM::HttpRequest.new("http://www.testserver.com").post body: "foo=bar&baz=bang", timeout: 60
168
- EM.stop
169
- end
170
- fiber.resume
171
- end
172
- }.not_to raise_error
173
- end
174
-
175
- after(:each) do
176
- EM.send(:remove_const, :Synchrony)
177
- EM.send(:remove_const, :HTTPMethods)
178
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.disable!
179
- $".reject! {|path| path.include? "em-http-request"}
180
- $".delete webmock_em_http
181
- $".delete File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
182
- require 'em-http-request'
183
- require File.expand_path(File.join(File.dirname(__FILE__), "../../../lib/webmock/http_lib_adapters/em_http_request_adapter.rb"))
184
- end
185
- end
186
- end
187
- end
188
-
189
- it "should work with streaming" do
190
- stub_request(:get, "www.example.com").to_return(body: "abc")
191
- response = ""
192
- EM.run {
193
- http = EventMachine::HttpRequest.new('http://www.example.com/').get
194
- http.stream { |chunk| response = chunk; EM.stop }
195
- }
196
- expect(response).to eq("abc")
197
- end
198
-
199
- it "should work with responses that use chunked transfer encoding" do
200
- stub_request(:get, "www.example.com").to_return(body: "abc", headers: { 'Transfer-Encoding' => 'chunked' })
201
- expect(http_request(:get, "http://www.example.com").body).to eq("abc")
202
- end
203
-
204
- it "should work with optional query params" do
205
- stub_request(:get, "www.example.com/?x=3&a[]=b&a[]=c").to_return(body: "abc")
206
- expect(http_request(:get, "http://www.example.com/?x=3", query: {"a" => ["b", "c"]}).body).to eq("abc")
207
- end
208
-
209
- it "should work with optional query params declared as string" do
210
- stub_request(:get, "www.example.com/?x=3&a[]=b&a[]=c").to_return(body: "abc")
211
- expect(http_request(:get, "http://www.example.com/?x=3", query: "a[]=b&a[]=c").body).to eq("abc")
212
- end
213
-
214
- it "should work when the body is passed as a Hash" do
215
- stub_request(:post, "www.example.com").with(body: {a: "1", b: "2"}).to_return(body: "ok")
216
- expect(http_request(:post, "http://www.example.com", body: {a: "1", b: "2"}).body).to eq("ok")
217
- end
218
-
219
- if defined?(EventMachine::HttpConnection)
220
- it "should work when a file is passed as body" do
221
- stub_request(:post, "www.example.com").with(body: File.read(__FILE__)).to_return(body: "ok")
222
- expect(http_request(:post, "http://www.example.com", file: __FILE__).body).to eq("ok")
223
- end
224
- end
225
-
226
- it "should work with UTF-8 strings" do
227
- body = "Привет, Мир!"
228
- stub_request(:post, "www.example.com").to_return(body: body)
229
- expect(http_request(:post, "http://www.example.com").body.bytesize).to eq(body.bytesize)
230
- end
231
-
232
- it "should work with multiple requests to the same connection" do
233
- stub_request(:get, "www.example.com/foo").to_return(body: "bar")
234
- stub_request(:get, "www.example.com/baz").to_return(body: "wombat")
235
- err1 = nil
236
- err2 = nil
237
- body1 = nil
238
- body2 = nil
239
- i = 0
240
-
241
- EM.run do
242
- conn = EM::HttpRequest.new("http://www.example.com")
243
- conn.get(path: "/foo").callback do |resp|
244
- body1 = resp.response
245
- i += 1; EM.stop if i == 2
246
- end.errback do |resp|
247
- err1 = resp.error
248
- i += 1; EM.stop if i == 2
249
- end
250
-
251
- conn.get(path: "/baz").callback do |resp|
252
- body2 = resp.response
253
- i += 1; EM.stop if i == 2
254
- end.errback do |resp|
255
- err2 = resp.error
256
- i += 1; EM.stop if i == 2
257
- end
258
- end
259
-
260
- expect(err1).to be(nil)
261
- expect(err2).to be(nil)
262
- expect(body1).to eq("bar")
263
- expect(body2).to eq("wombat")
264
- end
265
-
266
- it "should work with multiple requests to the same connection when the first request times out" do
267
- stub_request(:get, "www.example.com/foo").to_timeout.then.to_return(status: 200, body: "wombat")
268
- err = nil
269
- body = nil
270
-
271
- EM.run do
272
- conn = EM::HttpRequest.new("http://www.example.com")
273
- conn.get(path: "/foo").callback do |resp|
274
- err = :success_from_timeout
275
- EM.stop
276
- end.errback do |resp|
277
- conn.get(path: "/foo").callback do |retry_resp|
278
- expect(retry_resp.response_header.status).to eq(200)
279
- body = retry_resp.response
280
- EM.stop
281
- end.errback do |retry_resp|
282
- err = retry_resp.error
283
- EM.stop
284
- end
285
- end
286
- end
287
-
288
- expect(err).to be(nil)
289
- expect(body).to eq("wombat")
290
- end
291
-
292
- describe "mocking EM::HttpClient API" do
293
- let(:uri) { "http://www.example.com/" }
294
-
295
- before do
296
- stub_request(:get, uri)
297
- WebMock::HttpLibAdapters::EmHttpRequestAdapter.enable!
298
- end
299
-
300
- def client(uri, options = {})
301
- client = nil
302
- EM.run do
303
- client = EventMachine::HttpRequest.new(uri).get(options)
304
- client.callback { EM.stop }
305
- client.errback { failed }
306
- end
307
- client
308
- end
309
-
310
- subject { client(uri) }
311
-
312
- it 'should support #uri' do
313
- expect(subject.uri).to eq(Addressable::URI.parse(uri))
314
- end
315
-
316
- it 'should support #last_effective_url' do
317
- expect(subject.last_effective_url).to eq(Addressable::URI.parse(uri))
318
- end
319
-
320
- context "with a query" do
321
- let(:uri) { "http://www.example.com/?a=1&b=2" }
322
- subject { client("http://www.example.com/?a=1", query: { 'b' => 2 }) }
323
-
324
- it "#request_signature doesn't mutate the original uri" do
325
- expect(subject.uri).to eq(Addressable::URI.parse("http://www.example.com/?a=1"))
326
- signature = WebMock::RequestRegistry.instance.requested_signatures.hash.keys.first
327
- expect(signature.uri).to eq(Addressable::URI.parse(uri))
328
- end
329
- end
330
-
331
- describe 'get_response_cookie' do
332
-
333
- before(:each) do
334
- stub_request(:get, "http://example.org/").
335
- to_return(
336
- status: 200,
337
- body: "",
338
- headers: { 'Set-Cookie' => cookie_string }
339
- )
340
- end
341
-
342
- describe 'success' do
343
-
344
- context 'with only one cookie' do
345
-
346
- let(:cookie_name) { 'name_of_the_cookie' }
347
- let(:cookie_value) { 'value_of_the_cookie' }
348
- let(:cookie_string) { "#{cookie_name}=#{cookie_value}" }
349
-
350
- it 'successfully gets the cookie' do
351
- EM.run {
352
- http = EventMachine::HttpRequest.new('http://example.org').get
353
-
354
- http.errback { fail(http.error) }
355
- http.callback {
356
- expect(http.get_response_cookie(cookie_name)).to eq(cookie_value)
357
- EM.stop
358
- }
359
- }
360
- end
361
- end
362
-
363
- context 'with several cookies' do
364
-
365
- let(:cookie_name) { 'name_of_the_cookie' }
366
- let(:cookie_value) { 'value_of_the_cookie' }
367
- let(:cookie_2_name) { 'name_of_the_2nd_cookie' }
368
- let(:cookie_2_value) { 'value_of_the_2nd_cookie' }
369
- let(:cookie_string) { %W(#{cookie_name}=#{cookie_value} #{cookie_2_name}=#{cookie_2_value}) }
370
-
371
- it 'successfully gets both cookies' do
372
- EM.run {
373
- http = EventMachine::HttpRequest.new('http://example.org').get
374
-
375
- http.errback { fail(http.error) }
376
- http.callback {
377
- expect(http.get_response_cookie(cookie_name)).to eq(cookie_value)
378
- expect(http.get_response_cookie(cookie_2_name)).to eq(cookie_2_value)
379
- EM.stop
380
- }
381
- }
382
- end
383
- end
384
- end
385
-
386
- describe 'failure' do
387
-
388
- let(:cookie_string) { 'a=b' }
389
-
390
- it 'returns nil when no cookie is found' do
391
- EM.run {
392
- http = EventMachine::HttpRequest.new('http://example.org').get
393
-
394
- http.errback { fail(http.error) }
395
- http.callback {
396
- expect(http.get_response_cookie('not_found_cookie')).to eq(nil)
397
- EM.stop
398
- }
399
- }
400
- end
401
- end
402
- end
403
- end
404
-
405
- end
406
- end
@@ -1,77 +0,0 @@
1
- module EMHttpRequestSpecHelper
2
-
3
- def failed
4
- EventMachine.stop
5
- fail
6
- end
7
-
8
- def http_request(method, uri, options = {}, &block)
9
- @http = nil
10
- head = options[:headers] || {}
11
- if options[:basic_auth]
12
- head.merge!('authorization' => options[:basic_auth])
13
- end
14
- response = nil
15
- error = nil
16
- error_set = false
17
- uri = Addressable::URI.heuristic_parse(uri)
18
- EventMachine.run {
19
- request = EventMachine::HttpRequest.new("#{uri.normalize.to_s}")
20
- http = request.send(method, {
21
- timeout: 30,
22
- body: options[:body],
23
- file: options[:file],
24
- query: options[:query],
25
- head: head,
26
- compressed: false
27
- }, &block)
28
- http.errback {
29
- error_set = true
30
- error = if http.respond_to?(:errors)
31
- http.errors
32
- else
33
- http.error
34
- end
35
- failed
36
- }
37
- http.callback {
38
- response = OpenStruct.new({
39
- body: http.response,
40
- headers: WebMock::Util::Headers.normalize_headers(extract_response_headers(http)),
41
- message: http.response_header.http_reason,
42
- status: http.response_header.status.to_s
43
- })
44
- EventMachine.stop
45
- }
46
- @http = http
47
- }
48
- raise error.to_s if error_set
49
- response
50
- end
51
-
52
- def client_timeout_exception_class
53
- "WebMock timeout error"
54
- end
55
-
56
- def connection_refused_exception_class
57
- RuntimeError
58
- end
59
-
60
- def http_library
61
- :em_http_request
62
- end
63
-
64
- private
65
-
66
- def extract_response_headers(http)
67
- headers = {}
68
- if http.response_header
69
- http.response_header.each do |k,v|
70
- v = v.join(", ") if v.is_a?(Array)
71
- headers[k] = v
72
- end
73
- end
74
- headers
75
- end
76
-
77
- end
@@ -1,75 +0,0 @@
1
- require 'spec_helper'
2
- require 'acceptance/webmock_shared'
3
- require 'acceptance/excon/excon_spec_helper'
4
-
5
- describe "Excon" do
6
- include ExconSpecHelper
7
- include_context "with WebMock", :no_url_auth
8
-
9
- it 'should allow Excon requests to use query hash paramters' do
10
- stub_request(:get, "http://example.com/resource/?a=1&b=2").to_return(body: "abc")
11
- expect(Excon.new('http://example.com').get(path: "resource/", query: {a: 1, b: 2}).body).to eq("abc")
12
- end
13
-
14
- it 'should support Excon :expects options' do
15
- stub_request(:get, "http://example.com/").to_return(body: 'a')
16
- expect { Excon.new('http://example.com').get(expects: 204) }.to raise_error(Excon::Errors::OK)
17
- end
18
-
19
- context "with response_block" do
20
- it "should support excon response_block for real requests", net_connect: true do
21
- a = []
22
- WebMock.allow_net_connect!
23
- r = Excon.new('http://httpstat.us/200').get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
24
- expect(a).to eq(["2", "0", "0", " ", "O", "K"])
25
- expect(r.body).to eq("")
26
- end
27
-
28
- it "should support excon response_block" do
29
- a = []
30
- stub_request(:get, "http://example.com/").to_return(body: "abc")
31
- r = Excon.new('http://example.com').get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
32
- expect(a).to eq(['a', 'b', 'c'])
33
- expect(r.body).to eq("")
34
- end
35
-
36
- it "should invoke callbacks with response body even if a real request is made", net_connect: true do
37
- a = []
38
- WebMock.allow_net_connect!
39
- response = nil
40
- WebMock.after_request { |_, res|
41
- response = res
42
- }
43
- r = Excon.new('http://httpstat.us/200').get(response_block: lambda {|e, remaining, total| a << e}, chunk_size: 1)
44
- expect(response.body).to eq("200 OK")
45
- expect(a).to eq(["2", "0", "0", " ", "O", "K"])
46
- expect(r.body).to eq("")
47
- end
48
- end
49
-
50
- let(:file) { File.new(__FILE__) }
51
- let(:file_contents) { File.read(__FILE__) }
52
-
53
- it 'handles file uploads correctly' do
54
- stub_request(:put, "http://example.com/upload").with(body: file_contents)
55
-
56
- yielded_request_body = nil
57
- WebMock.after_request do |req, res|
58
- yielded_request_body = req.body
59
- end
60
-
61
- Excon.new("http://example.com").put(path: "upload", body: file)
62
-
63
- expect(yielded_request_body).to eq(file_contents)
64
- end
65
-
66
- describe '.request_params_from' do
67
-
68
- it 'rejects invalid request keys' do
69
- request_params = WebMock::HttpLibAdapters::ExconAdapter.request_params_from(body: :keep, fake: :reject)
70
- expect(request_params).to eq(body: :keep)
71
- end
72
-
73
- end
74
-
75
- end
@@ -1,50 +0,0 @@
1
- require 'ostruct'
2
-
3
- module ExconSpecHelper
4
-
5
- def http_request(method, uri, options = {}, &block)
6
- Excon.defaults[:ssl_verify_peer] = false
7
- Excon.defaults[:ciphers] = 'DEFAULT'
8
- uri = Addressable::URI.heuristic_parse(uri)
9
- uri = uri.to_s.gsub(' ', '%20')
10
-
11
- excon_options = {}
12
-
13
- if basic_auth = options.delete(:basic_auth)
14
- excon_options = {user: basic_auth[0], password: basic_auth[1]}
15
- end
16
-
17
- if Gem::Version.new(Excon::VERSION) < Gem::Version.new("0.29.0")
18
- options = options.merge(method: method, nonblock: false) # Dup and merge
19
- response = Excon.new(uri, excon_options).request(options, &block)
20
- else
21
- options = options.merge(method: method) # Dup and merge
22
- response = Excon.new(uri, excon_options.merge(nonblock: false)).request(options, &block)
23
- end
24
-
25
- headers = WebMock::Util::Headers.normalize_headers(response.headers)
26
- headers = headers.inject({}) do |res, (name, value)|
27
- res[name] = value.is_a?(Array) ? value.flatten.join(', ') : value
28
- res
29
- end
30
-
31
- OpenStruct.new \
32
- body: response.body,
33
- headers: headers,
34
- status: response.status.to_s,
35
- message: response.reason_phrase
36
- end
37
-
38
- def client_timeout_exception_class
39
- Excon::Errors::Timeout
40
- end
41
-
42
- def connection_refused_exception_class
43
- Excon::Errors::SocketError
44
- end
45
-
46
- def http_library
47
- :excon
48
- end
49
-
50
- end
@@ -1,73 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require "spec_helper"
4
- require "acceptance/webmock_shared"
5
- require "acceptance/http_rb/http_rb_spec_helper"
6
-
7
- describe "HTTP.rb" do
8
- include HttpRbSpecHelper
9
-
10
- include_examples "with WebMock", :no_status_message
11
-
12
- context "streaming body" do
13
- let(:response) { HTTP.get "http://example.com" }
14
- before { stub_simple_request "example.com", 302, {}, "abc" }
15
-
16
- it "works as if it was streamed from socket" do
17
- expect(response.body.readpartial 1).to eq "a"
18
- end
19
-
20
- it "fails if body was already streamed" do
21
- response.body.to_s
22
- expect { response.body.readpartial 1 }.to raise_error(HTTP::StateError)
23
- end
24
- end
25
-
26
- context "without following redirects" do
27
- let(:response) { http_request(:get, "http://example.com") }
28
- let(:headers) { response.headers }
29
-
30
- it "stops on first request" do
31
- stub_simple_request("example.com", 302, "Location" => "http://www.example.com")
32
- stub_simple_request("www.example.com")
33
-
34
- expect(headers).to include "Host" => "example.com"
35
- end
36
- end
37
-
38
- context "following redirects" do
39
- let(:options) { { follow: true } }
40
- let(:response) { http_request(:get, "http://example.com", options) }
41
- let(:headers) { response.headers }
42
-
43
- it "returns response of destination" do
44
- stub_simple_request("example.com", 302, "Location" => "http://www.example.com")
45
- stub_simple_request("www.example.com")
46
-
47
- expect(headers).to include "Host" => "www.example.com"
48
- end
49
- end
50
-
51
- context "restored request uri on replayed response object" do
52
- it "keeps non-default port" do
53
- stub_request :get, "example.com:1234/foo"
54
- response = HTTP.get "http://example.com:1234/foo"
55
-
56
- expect(response.uri.to_s).to eq "http://example.com:1234/foo"
57
- end
58
-
59
- it "does not injects default port" do
60
- stub_request :get, "example.com/foo"
61
- response = HTTP.get "http://example.com/foo"
62
-
63
- expect(response.uri.to_s).to eq "http://example.com/foo"
64
- end
65
-
66
- it "strips out default port even if it was explicitly given" do
67
- stub_request :get, "example.com/foo"
68
- response = HTTP.get "http://example.com:80/foo"
69
-
70
- expect(response.uri.to_s).to eq "http://example.com/foo"
71
- end
72
- end
73
- end