webmock 1.24.6 → 2.0.0.beta1

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 (48) hide show
  1. checksums.yaml +7 -0
  2. data/.travis.yml +0 -9
  3. data/CHANGELOG.md +37 -8
  4. data/Gemfile +1 -5
  5. data/README.md +22 -51
  6. data/Rakefile +0 -23
  7. data/lib/webmock.rb +0 -12
  8. data/lib/webmock/cucumber.rb +2 -0
  9. data/lib/webmock/http_lib_adapters/curb_adapter.rb +9 -3
  10. data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +220 -9
  11. data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -0
  12. data/lib/webmock/http_lib_adapters/http_rb/response.rb +1 -1
  13. data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +0 -38
  14. data/lib/webmock/http_lib_adapters/manticore_adapter.rb +6 -2
  15. data/lib/webmock/http_lib_adapters/net_http.rb +2 -10
  16. data/lib/webmock/http_lib_adapters/patron_adapter.rb +7 -3
  17. data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +6 -2
  18. data/lib/webmock/minitest.rb +2 -0
  19. data/lib/webmock/request_pattern.rb +16 -1
  20. data/lib/webmock/response.rb +0 -7
  21. data/lib/webmock/rspec.rb +2 -0
  22. data/lib/webmock/test_unit.rb +2 -0
  23. data/lib/webmock/util/headers.rb +4 -0
  24. data/lib/webmock/util/query_mapper.rb +1 -2
  25. data/lib/webmock/version.rb +1 -1
  26. data/lib/webmock/webmock.rb +0 -2
  27. data/spec/acceptance/curb/curb_spec_helper.rb +6 -3
  28. data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +4 -1
  29. data/spec/acceptance/excon/excon_spec_helper.rb +9 -3
  30. data/spec/acceptance/http_rb/http_rb_spec_helper.rb +7 -1
  31. data/spec/acceptance/httpclient/httpclient_spec_helper.rb +5 -2
  32. data/spec/acceptance/manticore/manticore_spec_helper.rb +5 -1
  33. data/spec/acceptance/net_http/net_http_spec.rb +2 -2
  34. data/spec/acceptance/net_http/net_http_spec_helper.rb +4 -1
  35. data/spec/acceptance/patron/patron_spec_helper.rb +6 -3
  36. data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +2 -2
  37. data/spec/acceptance/shared/request_expectations.rb +64 -7
  38. data/spec/acceptance/shared/stubbing_requests.rb +51 -1
  39. data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +11 -8
  40. data/spec/spec_helper.rb +0 -4
  41. data/spec/unit/request_pattern_spec.rb +1 -1
  42. data/spec/unit/util/query_mapper_spec.rb +0 -16
  43. data/webmock.gemspec +5 -7
  44. metadata +187 -236
  45. data/Appraisals +0 -3
  46. data/gemfiles/ruby_1_8.gemfile +0 -21
  47. data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_0_x.rb +0 -147
  48. data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +0 -228
data/Appraisals DELETED
@@ -1,3 +0,0 @@
1
- appraise "ruby_1_8" do
2
- gem "addressable", ">= 2.3.6", "< 2.4.0"
3
- end
@@ -1,21 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "http://rubygems.org/"
4
-
5
- gem "addressable", ">= 2.3.6", "< 2.4.0"
6
-
7
- gem "curb", "< 0.9.2"
8
-
9
- group :development do
10
- gem "rake", '~> 10.5.0'
11
- end
12
-
13
- group :test do
14
- gem "minitest_tu_shim", "1.3.2"
15
- end
16
-
17
- platforms :jruby do
18
- gem "jruby-openssl"
19
- end
20
-
21
- gemspec :path => "../"
@@ -1,147 +0,0 @@
1
- if defined?(EventMachine::HttpRequest)
2
- module WebMock
3
- module HttpLibAdapters
4
- class EmHttpRequestAdapter < HttpLibAdapter
5
- adapter_for :em_http_request
6
-
7
- OriginalHttpRequest = EventMachine::HttpRequest unless const_defined?(:OriginalHttpRequest)
8
-
9
- def self.enable!
10
- EventMachine.send(:remove_const, :HttpRequest)
11
- EventMachine.send(:const_set, :HttpRequest, EventMachine::WebMockHttpRequest)
12
- end
13
-
14
- def self.disable!
15
- EventMachine.send(:remove_const, :HttpRequest)
16
- EventMachine.send(:const_set, :HttpRequest, OriginalHttpRequest)
17
- end
18
- end
19
- end
20
- end
21
-
22
-
23
- module EventMachine
24
- class WebMockHttpRequest < EventMachine::HttpRequest
25
-
26
- include HttpEncoding
27
-
28
- class WebMockHttpClient < EventMachine::HttpClient
29
-
30
- def setup(response, uri, error = nil)
31
- @last_effective_url = @uri = uri
32
- if error
33
- on_error(error)
34
- fail(self)
35
- else
36
- EM.next_tick do
37
- receive_data(response)
38
- succeed(self)
39
- end
40
- end
41
- end
42
-
43
- def unbind
44
- end
45
-
46
- def close_connection
47
- end
48
- end
49
-
50
- def send_request(&block)
51
- request_signature = build_request_signature
52
-
53
- WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
54
-
55
- if webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature)
56
- WebMock::CallbackRegistry.invoke_callbacks(
57
- {:lib => :em_http_request}, request_signature, webmock_response)
58
- client = WebMockHttpClient.new(nil)
59
- client.on_error("WebMock timeout error") if webmock_response.should_timeout
60
- client.setup(make_raw_response(webmock_response), @uri,
61
- webmock_response.should_timeout ? "WebMock timeout error" : nil)
62
- client
63
- elsif WebMock.net_connect_allowed?(request_signature.uri)
64
- http = super
65
- http.callback {
66
- if WebMock::CallbackRegistry.any_callbacks?
67
- webmock_response = build_webmock_response(http)
68
- WebMock::CallbackRegistry.invoke_callbacks(
69
- {:lib => :em_http_request, :real_request => true}, request_signature,
70
- webmock_response)
71
- end
72
- }
73
- http
74
- else
75
- raise WebMock::NetConnectNotAllowedError.new(request_signature)
76
- end
77
- end
78
-
79
- private
80
-
81
- def build_webmock_response(http)
82
- webmock_response = WebMock::Response.new
83
- webmock_response.status = [http.response_header.status, http.response_header.http_reason]
84
- webmock_response.headers = http.response_header
85
- webmock_response.body = http.response
86
- webmock_response
87
- end
88
-
89
- def build_request_signature
90
- if @req
91
- options = @req.options
92
- method = @req.method
93
- uri = @req.uri.dup
94
- else
95
- options = @options
96
- method = @method
97
- uri = @uri.dup
98
- end
99
-
100
- if options[:authorization] || options['authorization']
101
- auth = (options[:authorization] || options['authorization'])
102
- userinfo = auth.join(':')
103
- userinfo = WebMock::Util::URI.encode_unsafe_chars_in_userinfo(userinfo)
104
- options.reject! {|k,v| k.to_s == 'authorization' } #we added it to url userinfo
105
- uri.userinfo = userinfo
106
- end
107
-
108
- uri.query = encode_query(@req.uri, options[:query]).slice(/\?(.*)/, 1)
109
-
110
- body = options[:body] || options['body']
111
- body = form_encode_body(body) if body.is_a?(Hash)
112
-
113
- WebMock::RequestSignature.new(
114
- method.downcase.to_sym,
115
- uri.to_s,
116
- :body => body,
117
- :headers => (options[:head] || options['head'])
118
- )
119
- end
120
-
121
-
122
- def make_raw_response(response)
123
- response.raise_error_if_any
124
-
125
- status, headers, body = response.status, response.headers, response.body
126
-
127
- response_string = []
128
- response_string << "HTTP/1.1 #{status[0]} #{status[1]}"
129
-
130
- headers.each do |header, value|
131
- value = value.join(", ") if value.is_a?(Array)
132
-
133
- # WebMock's internal processing will not handle the body
134
- # correctly if the header indicates that it is chunked, unless
135
- # we also create all the chunks.
136
- # It's far easier just to remove the header.
137
- next if header =~ /transfer-encoding/i && value =~/chunked/i
138
-
139
- response_string << "#{header}: #{value}"
140
- end if headers
141
-
142
- response_string << "" << body
143
- response_string.join("\n")
144
- end
145
- end
146
- end
147
- end
@@ -1,228 +0,0 @@
1
- if defined?(EventMachine::HttpClient)
2
- module WebMock
3
- module HttpLibAdapters
4
- class EmHttpRequestAdapter < HttpLibAdapter
5
- adapter_for :em_http_request
6
-
7
- OriginalHttpClient = EventMachine::HttpClient unless const_defined?(:OriginalHttpClient)
8
- OriginalHttpConnection = EventMachine::HttpConnection unless const_defined?(:OriginalHttpConnection)
9
-
10
- def self.enable!
11
- EventMachine.send(:remove_const, :HttpConnection)
12
- EventMachine.send(:const_set, :HttpConnection, EventMachine::WebMockHttpConnection)
13
- EventMachine.send(:remove_const, :HttpClient)
14
- EventMachine.send(:const_set, :HttpClient, EventMachine::WebMockHttpClient)
15
- end
16
-
17
- def self.disable!
18
- EventMachine.send(:remove_const, :HttpConnection)
19
- EventMachine.send(:const_set, :HttpConnection, OriginalHttpConnection)
20
- EventMachine.send(:remove_const, :HttpClient)
21
- EventMachine.send(:const_set, :HttpClient, OriginalHttpClient)
22
- end
23
- end
24
- end
25
- end
26
-
27
- module EventMachine
28
- if defined?(Synchrony) && HTTPMethods.instance_methods.include?(:aget)
29
- # have to make the callbacks fire on the next tick in order
30
- # to avoid the dreaded "double resume" exception
31
- module HTTPMethods
32
- %w[get head post delete put].each do |type|
33
- class_eval %[
34
- def #{type}(options = {}, &blk)
35
- f = Fiber.current
36
-
37
- conn = setup_request(:#{type}, options, &blk)
38
- conn.callback { EM.next_tick { f.resume(conn) } }
39
- conn.errback { EM.next_tick { f.resume(conn) } }
40
-
41
- Fiber.yield
42
- end
43
- ]
44
- end
45
- end
46
- end
47
-
48
- class WebMockHttpConnection < HttpConnection
49
- def activate_connection(client)
50
- request_signature = client.request_signature
51
-
52
- if client.stubbed_webmock_response
53
- conn = HttpStubConnection.new rand(10000)
54
- post_init
55
-
56
- @deferred = false
57
- @conn = conn
58
-
59
- conn.parent = self
60
- conn.pending_connect_timeout = @connopts.connect_timeout
61
- conn.comm_inactivity_timeout = @connopts.inactivity_timeout
62
-
63
- finalize_request(client)
64
- @conn.set_deferred_status :succeeded
65
- elsif WebMock.net_connect_allowed?(request_signature.uri)
66
- super
67
- else
68
- raise WebMock::NetConnectNotAllowedError.new(request_signature)
69
- end
70
- end
71
-
72
- def drop_client
73
- @clients.shift
74
- end
75
- end
76
-
77
- class WebMockHttpClient < EventMachine::HttpClient
78
- include HttpEncoding
79
-
80
- def uri
81
- @req.uri
82
- end
83
-
84
- def setup(response, uri, error = nil)
85
- @last_effective_url = @uri = uri
86
- if error
87
- on_error(error)
88
- @conn.drop_client
89
- fail(self)
90
- else
91
- @conn.receive_data(response)
92
- succeed(self)
93
- end
94
- end
95
-
96
- def send_request(head, body)
97
- WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
98
-
99
- if stubbed_webmock_response
100
- WebMock::CallbackRegistry.invoke_callbacks({:lib => :em_http_request}, request_signature, stubbed_webmock_response)
101
- @uri ||= nil
102
- EM.next_tick {
103
- setup(make_raw_response(stubbed_webmock_response), @uri,
104
- stubbed_webmock_response.should_timeout ? "WebMock timeout error" : nil)
105
- }
106
- self
107
- elsif WebMock.net_connect_allowed?(request_signature.uri)
108
- super
109
- else
110
- raise WebMock::NetConnectNotAllowedError.new(request_signature)
111
- end
112
- end
113
-
114
- def unbind(reason = nil)
115
- if !stubbed_webmock_response && WebMock::CallbackRegistry.any_callbacks?
116
- webmock_response = build_webmock_response
117
- WebMock::CallbackRegistry.invoke_callbacks(
118
- {:lib => :em_http_request, :real_request => true},
119
- request_signature,
120
- webmock_response)
121
- end
122
- @request_signature = nil
123
- remove_instance_variable(:@stubbed_webmock_response)
124
-
125
- super
126
- end
127
-
128
- def request_signature
129
- @request_signature ||= build_request_signature
130
- end
131
-
132
- def stubbed_webmock_response
133
- unless defined?(@stubbed_webmock_response)
134
- @stubbed_webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature)
135
- end
136
-
137
- @stubbed_webmock_response
138
- end
139
-
140
- def get_response_cookie(name)
141
- name = name.to_s
142
-
143
- raw_cookie = response_header.cookie
144
- raw_cookie = [raw_cookie] if raw_cookie.is_a? String
145
-
146
- cookie = raw_cookie.select { |c| c.start_with? name }.first
147
- cookie and cookie.split('=', 2)[1]
148
- end
149
-
150
- private
151
-
152
- def build_webmock_response
153
- webmock_response = WebMock::Response.new
154
- webmock_response.status = [response_header.status, response_header.http_reason]
155
- webmock_response.headers = response_header
156
- webmock_response.body = response
157
- webmock_response
158
- end
159
-
160
- def build_request_signature
161
- headers, body = @req.headers, @req.body
162
-
163
- @conn.middleware.select {|m| m.respond_to?(:request) }.each do |m|
164
- headers, body = m.request(self, headers, body)
165
- end
166
-
167
- method = @req.method
168
- uri = @req.uri.clone
169
- auth = @req.headers[:'proxy-authorization']
170
- query = @req.query
171
-
172
- if auth
173
- userinfo = auth.join(':')
174
- userinfo = WebMock::Util::URI.encode_unsafe_chars_in_userinfo(userinfo)
175
- if @req
176
- @req.proxy.reject! {|k,v| t.to_s == 'authorization' }
177
- else
178
- options.reject! {|k,v| k.to_s == 'authorization' } #we added it to url userinfo
179
- end
180
- uri.userinfo = userinfo
181
- end
182
-
183
- uri.query = encode_query(@req.uri, query).slice(/\?(.*)/, 1)
184
-
185
- body = form_encode_body(body) if body.is_a?(Hash)
186
-
187
- WebMock::RequestSignature.new(
188
- method.downcase.to_sym,
189
- uri.to_s,
190
- :body => body || (@req.file && File.read(@req.file)),
191
- :headers => headers
192
- )
193
- end
194
-
195
- def make_raw_response(response)
196
- response.raise_error_if_any
197
-
198
- status, headers, body = response.status, response.headers, response.body
199
- headers ||= {}
200
-
201
- response_string = []
202
- response_string << "HTTP/1.1 #{status[0]} #{status[1]}"
203
-
204
- headers["Content-Length"] = body.bytesize unless headers["Content-Length"]
205
- headers.each do |header, value|
206
- if header =~ /set-cookie/i
207
- [value].flatten.each do |cookie|
208
- response_string << "#{header}: #{cookie}"
209
- end
210
- else
211
- value = value.join(", ") if value.is_a?(Array)
212
-
213
- # WebMock's internal processing will not handle the body
214
- # correctly if the header indicates that it is chunked, unless
215
- # we also create all the chunks.
216
- # It's far easier just to remove the header.
217
- next if header =~ /transfer-encoding/i && value =~/chunked/i
218
-
219
- response_string << "#{header}: #{value}"
220
- end
221
- end if headers
222
-
223
- response_string << "" << body
224
- response_string.join("\n")
225
- end
226
- end
227
- end
228
- end