webmock 1.24.6 → 2.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.travis.yml +0 -9
- data/CHANGELOG.md +37 -8
- data/Gemfile +1 -5
- data/README.md +22 -51
- data/Rakefile +0 -23
- data/lib/webmock.rb +0 -12
- data/lib/webmock/cucumber.rb +2 -0
- data/lib/webmock/http_lib_adapters/curb_adapter.rb +9 -3
- data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +220 -9
- data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_rb/response.rb +1 -1
- data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +0 -38
- data/lib/webmock/http_lib_adapters/manticore_adapter.rb +6 -2
- data/lib/webmock/http_lib_adapters/net_http.rb +2 -10
- data/lib/webmock/http_lib_adapters/patron_adapter.rb +7 -3
- data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +6 -2
- data/lib/webmock/minitest.rb +2 -0
- data/lib/webmock/request_pattern.rb +16 -1
- data/lib/webmock/response.rb +0 -7
- data/lib/webmock/rspec.rb +2 -0
- data/lib/webmock/test_unit.rb +2 -0
- data/lib/webmock/util/headers.rb +4 -0
- data/lib/webmock/util/query_mapper.rb +1 -2
- data/lib/webmock/version.rb +1 -1
- data/lib/webmock/webmock.rb +0 -2
- data/spec/acceptance/curb/curb_spec_helper.rb +6 -3
- data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +4 -1
- data/spec/acceptance/excon/excon_spec_helper.rb +9 -3
- data/spec/acceptance/http_rb/http_rb_spec_helper.rb +7 -1
- data/spec/acceptance/httpclient/httpclient_spec_helper.rb +5 -2
- data/spec/acceptance/manticore/manticore_spec_helper.rb +5 -1
- data/spec/acceptance/net_http/net_http_spec.rb +2 -2
- data/spec/acceptance/net_http/net_http_spec_helper.rb +4 -1
- data/spec/acceptance/patron/patron_spec_helper.rb +6 -3
- data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +2 -2
- data/spec/acceptance/shared/request_expectations.rb +64 -7
- data/spec/acceptance/shared/stubbing_requests.rb +51 -1
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +11 -8
- data/spec/spec_helper.rb +0 -4
- data/spec/unit/request_pattern_spec.rb +1 -1
- data/spec/unit/util/query_mapper_spec.rb +0 -16
- data/webmock.gemspec +5 -7
- metadata +187 -236
- data/Appraisals +0 -3
- data/gemfiles/ruby_1_8.gemfile +0 -21
- data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_0_x.rb +0 -147
- data/lib/webmock/http_lib_adapters/em_http_request/em_http_request_1_x.rb +0 -228
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ff6dc7d940f08ae334e0220100267ab6a41a58e4
|
4
|
+
data.tar.gz: 35dd3369af56b08b38fdf59f943c56b9552eb31e
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f8448b8a8a176d912a448912133bc68b0edfa37c136235821f938153a7ef421ac2a2218996de115676469c781668a1b70abf0740140b2a3751419b7b267762b0
|
7
|
+
data.tar.gz: 389edffa68682edbf92649d0346073193abf5dd9d918249a3c6d381eecb5ae2954b01a739d803b467bbc65bf1438a82b30bb322c9796a93010b881ec28322dd1
|
data/.travis.yml
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
rvm:
|
2
|
-
- 1.9.2
|
3
2
|
- 1.9.3
|
4
3
|
- 2.0.0
|
5
4
|
- 2.1.0
|
@@ -14,16 +13,8 @@ rvm:
|
|
14
13
|
- jruby
|
15
14
|
- jruby-head
|
16
15
|
matrix:
|
17
|
-
include:
|
18
|
-
- rvm: 1.8.7
|
19
|
-
gemfile: gemfiles/ruby_1_8.gemfile
|
20
|
-
- rvm: ree
|
21
|
-
gemfile: gemfiles/ruby_1_8.gemfile
|
22
|
-
- rvm: jruby-18mode
|
23
|
-
gemfile: gemfiles/ruby_1_8.gemfile
|
24
16
|
allow_failures:
|
25
17
|
- rvm: jruby-9.0.0.0
|
26
|
-
- rvm: jruby-18mode
|
27
18
|
- rvm: jruby-head
|
28
19
|
- rvm: ruby-head
|
29
20
|
- rvm: rbx-2
|
data/CHANGELOG.md
CHANGED
@@ -1,19 +1,43 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
-
##
|
3
|
+
## 2.0.0
|
4
4
|
|
5
|
-
*
|
5
|
+
* require 'webmock' does not enable WebMock anymore. `gem 'webmock'` can be now safely added to the Gemfile without modifying http clients. Call `WebMock.enable!` to enable it.
|
6
6
|
|
7
|
-
|
7
|
+
Please note that `require 'webmock/rspec'`, `require 'webmock/test_unit'`, `require 'webmock/minitest'` and `require 'webmock/cucumber'` still do enable WebMock.
|
8
8
|
|
9
|
-
*
|
9
|
+
* Dropped support for Ruby < 1.9.3
|
10
10
|
|
11
|
-
|
11
|
+
* Dropped support for em-http-request < 1.0.0
|
12
12
|
|
13
|
-
*
|
13
|
+
* WebMock 2.0 does not match basic auth credentials in the userinfo part of the url, with credentials passed in `Authorization: Basic ...` header.
|
14
|
+
It now treats the Authorization header and credentials in userinfo in the url as completely separate attributes of the request.
|
15
|
+
|
16
|
+
The following stub declaration, which used to work in WebMock 1.x, is not going to work anymore
|
17
|
+
|
18
|
+
stub_request(:get, "user:pass@www.example.com")
|
19
|
+
|
20
|
+
Net::HTTP.start('www.example.com') do |http|
|
21
|
+
req = Net::HTTP::Get.new('/')
|
22
|
+
req.basic_auth 'user', 'pass'
|
23
|
+
http.request(req)
|
24
|
+
end # ===> Failure
|
25
|
+
|
26
|
+
In order to stub a request with basic authentication credentials provided in the Authorization header, please use the following code:
|
27
|
+
|
28
|
+
stub_request(:get, "www.example.com").with(basic_auth: ['user', 'pass'])
|
29
|
+
|
30
|
+
or
|
31
|
+
|
32
|
+
stub_request(:get, "www.example.com").
|
33
|
+
with(headers: 'Authorization' => "Basic #{ Base64.encode64('user:pass').chomp}")
|
34
|
+
|
35
|
+
In order to stub a request with basic authentication credentials provided in the url please use the following code:
|
36
|
+
|
37
|
+
stub_request(:get, "user:pass@www.example.com")
|
38
|
+
|
39
|
+
RestClient.get('user:pass@www.example.com') # ===> Success
|
14
40
|
|
15
|
-
Thanks to [Tim Diggins](https://github.com/timdiggins) for reporting the issue.
|
16
|
-
Thanks to [Cedric Pimenta](https://github.com/cedricpim) for finding the solution.
|
17
41
|
|
18
42
|
## 1.24.3
|
19
43
|
|
@@ -21,6 +45,11 @@
|
|
21
45
|
|
22
46
|
Thanks to [Alex Kestner](https://github.com/akestner)
|
23
47
|
|
48
|
+
* Fixed the issue with parsing query to a hash with nested array i.e. `a[][b][]=one&a[][c][]=two`
|
49
|
+
|
50
|
+
Thanks to [Tim Diggins](https://github.com/timdiggins) for reporting the issue.
|
51
|
+
Thanks to [Cedric Pimenta](https://github.com/cedricpim) for finding the solution.
|
52
|
+
|
24
53
|
* Added a clear message on an attept to match a multipart encoded request body.
|
25
54
|
WebMock does't support requests with multipart body... yet.
|
26
55
|
|
data/Gemfile
CHANGED
@@ -1,13 +1,9 @@
|
|
1
1
|
source 'http://rubygems.org/'
|
2
2
|
|
3
3
|
gemspec
|
4
|
-
if ENV["EM_HTTP_REQUEST_0_X"]
|
5
|
-
gem 'em-http-request', '~> 0.3.0'
|
6
|
-
end
|
7
4
|
|
8
5
|
group :development do
|
9
|
-
gem 'rake'
|
10
|
-
gem 'rake' if RUBY_VERSION >= '1.9.3'
|
6
|
+
gem 'rake'
|
11
7
|
end
|
12
8
|
|
13
9
|
group :test do
|
data/README.md
CHANGED
@@ -32,15 +32,11 @@ Supported HTTP libraries
|
|
32
32
|
Supported Ruby Interpreters
|
33
33
|
---------------------------
|
34
34
|
|
35
|
-
* MRI 1.8.7
|
36
|
-
* MRI 1.9.1
|
37
|
-
* MRI 1.9.2
|
38
35
|
* MRI 1.9.3
|
39
36
|
* MRI 2.0.0
|
40
37
|
* MRI 2.1
|
41
38
|
* MRI 2.2
|
42
39
|
* MRI 2.3
|
43
|
-
* REE 1.8.7
|
44
40
|
* JRuby
|
45
41
|
* Rubinius
|
46
42
|
|
@@ -54,6 +50,10 @@ Supported Ruby Interpreters
|
|
54
50
|
cd webmock
|
55
51
|
rake install
|
56
52
|
|
53
|
+
## Upgrading from v1.x to v2.x
|
54
|
+
|
55
|
+
WebMock 2.x has changed somewhat since version 1.x. Changes are listed in [CHANGELOG.md](CHANGELOG.md)
|
56
|
+
|
57
57
|
### Test::Unit
|
58
58
|
|
59
59
|
Add the following code to `test/test_helper.rb`
|
@@ -93,11 +93,9 @@ You can also use WebMock outside a test framework:
|
|
93
93
|
```ruby
|
94
94
|
require 'webmock'
|
95
95
|
include WebMock::API
|
96
|
-
```
|
97
|
-
|
98
|
-
### Automatically enabled
|
99
96
|
|
100
|
-
|
97
|
+
WebMock.enable!
|
98
|
+
```
|
101
99
|
|
102
100
|
## Examples
|
103
101
|
|
@@ -205,10 +203,13 @@ stub_request(:post, "www.example.com").with { |request| request.body == "abc" }
|
|
205
203
|
RestClient.post('www.example.com', 'abc') # ===> Success
|
206
204
|
```
|
207
205
|
|
208
|
-
### Request with basic authentication
|
206
|
+
### Request with basic authentication header
|
209
207
|
|
210
208
|
```ruby
|
211
|
-
stub_request(:get, "
|
209
|
+
stub_request(:get, "www.example.com").with(basic_auth: ['user', 'pass'])
|
210
|
+
# or
|
211
|
+
# stub_request(:get, "www.example.com").
|
212
|
+
# with(headers: 'Authorization' => "Basic #{ Base64.encode64('user:pass').chomp}")
|
212
213
|
|
213
214
|
Net::HTTP.start('www.example.com') do |http|
|
214
215
|
req = Net::HTTP::Get.new('/')
|
@@ -217,6 +218,16 @@ Net::HTTP.start('www.example.com') do |http|
|
|
217
218
|
end # ===> Success
|
218
219
|
```
|
219
220
|
|
221
|
+
##### Important! Since version 2.0.0, WebMock does not match credentials provided in Authorization header and credentials provided in the userinfo of a url. I.e. `stub_request(:get, "user:pass@www.example.com")` does not match a request with credentials provided in the Athoriation header.
|
222
|
+
|
223
|
+
### Request with basic authentication in the url
|
224
|
+
|
225
|
+
```ruby
|
226
|
+
stub_request(:get, "user:pass@www.example.com")
|
227
|
+
|
228
|
+
RestClient.get('user:pass@www.example.com') # ===> Success
|
229
|
+
```
|
230
|
+
|
220
231
|
### Matching uris using regular expressions
|
221
232
|
|
222
233
|
```ruby
|
@@ -739,7 +750,7 @@ I.e all the following representations of the URI are equal:
|
|
739
750
|
"http://www.example.com:80/"
|
740
751
|
```
|
741
752
|
|
742
|
-
The following URIs with
|
753
|
+
The following URIs with userinfo are also equal for WebMock
|
743
754
|
|
744
755
|
```ruby
|
745
756
|
"a b:pass@www.example.com"
|
@@ -842,45 +853,6 @@ In order to work on Webmock you first need to fork and clone the repo.
|
|
842
853
|
Please do any work on a dedicated branch and rebase against master
|
843
854
|
before sending a pull request.
|
844
855
|
|
845
|
-
#### Running Tests
|
846
|
-
|
847
|
-
We use RVM in order to test WebMock against 1.8.6, REE, 1.8.7, 1.9.2 and
|
848
|
-
jRuby. You can get RVM setup for WebMock development using the
|
849
|
-
following commands (if you don't have these version of Ruby installed
|
850
|
-
use `rvm install` to install each of them).
|
851
|
-
|
852
|
-
rvm use --create 1.8.6@webmock
|
853
|
-
gem install jeweler bundler
|
854
|
-
bundle install
|
855
|
-
|
856
|
-
rvm use --create ree@webmock
|
857
|
-
gem install jeweler bundler
|
858
|
-
bundle install
|
859
|
-
|
860
|
-
rvm use --create 1.8.7@webmock
|
861
|
-
gem install jeweler bundler
|
862
|
-
bundle install
|
863
|
-
|
864
|
-
rvm use --create 1.9.2@webmock
|
865
|
-
gem install jeweler bundler
|
866
|
-
bundle install
|
867
|
-
|
868
|
-
rvm use --create jruby@webmock
|
869
|
-
gem install jeweler bundler
|
870
|
-
bundle install
|
871
|
-
|
872
|
-
These commands will create a gemset named WebMock for each of the
|
873
|
-
supported versions of Ruby and `bundle install` all dependencies.
|
874
|
-
|
875
|
-
With the supported versions of Ruby installed RVM will run specs across
|
876
|
-
all version with just one command.
|
877
|
-
|
878
|
-
bundle exec rvm 1.8.6@webmock,ree@webmock,1.8.7@webmock,1.9.2@webmock,jruby@webmock rspec spec/**/*_spec.rb
|
879
|
-
|
880
|
-
This command is wrapped up in to a rake task and can be invoked like so:
|
881
|
-
|
882
|
-
rake rvm:specs
|
883
|
-
|
884
856
|
## Credits
|
885
857
|
|
886
858
|
The initial lines of this project were written during New Bamboo [Hack Day](http://blog.new-bamboo.co.uk/2009/11/13/hackday-results)
|
@@ -1043,7 +1015,6 @@ People who submitted patches and new features or suggested improvements. Many th
|
|
1043
1015
|
* Manfred Stienstra
|
1044
1016
|
* Tim Diggins
|
1045
1017
|
* Gabriel Chaney
|
1046
|
-
* Chris Griego
|
1047
1018
|
|
1048
1019
|
For a full list of contributors you can visit the
|
1049
1020
|
[contributors](https://github.com/bblimke/webmock/contributors) page.
|
data/Rakefile
CHANGED
@@ -3,17 +3,6 @@
|
|
3
3
|
require 'bundler'
|
4
4
|
Bundler::GemHelper.install_tasks
|
5
5
|
|
6
|
-
namespace :rvm do
|
7
|
-
desc 'Run specs against 1.8.6, REE, 1.8.7, 1.9.2 and jRuby'
|
8
|
-
task :specs do
|
9
|
-
# JCF: I'd love to be able to use RVM's `rvm {rubies} specs` command but
|
10
|
-
# the require tests in spec/other_net_http_libs_spec.rb break when doing
|
11
|
-
# so.
|
12
|
-
spec_files = Dir[File.dirname(__FILE__) + '/spec/**/*_spec.rb'].join(' ')
|
13
|
-
sh "rvm 1.8.6@webmock,ree@webmock,1.8.7@webmock,1.9.2@webmock,jruby@webmock exec rspec #{spec_files}"
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
6
|
require "rspec/core/rake_task"
|
18
7
|
RSpec::Core::RakeTask.new(:spec) do |t|
|
19
8
|
t.rspec_opts = ["-c", "-f progress", "-r ./spec/spec_helper.rb"]
|
@@ -25,11 +14,6 @@ RSpec::Core::RakeTask.new(:spec_http_without_webmock) do |t|
|
|
25
14
|
t.pattern = 'spec/acceptance/net_http/real_net_http_spec.rb'
|
26
15
|
end
|
27
16
|
|
28
|
-
|
29
|
-
task :em_http_request_0_x_spec do
|
30
|
-
sh "EM_HTTP_REQUEST_0_X=true bundle install && EM_HTTP_REQUEST_0_X=true bundle exec rspec spec/acceptance/em_http_request/em_http_request_spec.rb" if RUBY_VERSION <= "1.8.7"
|
31
|
-
end
|
32
|
-
|
33
17
|
require 'rake/testtask'
|
34
18
|
Rake::TestTask.new(:test) do |test|
|
35
19
|
test.test_files = FileList["test/**/*.rb"].exclude("test/test_helper.rb")
|
@@ -43,11 +27,4 @@ Rake::TestTask.new(:minitest) do |test|
|
|
43
27
|
test.warning = false
|
44
28
|
end
|
45
29
|
|
46
|
-
|
47
30
|
task :default => [:spec, :spec_http_without_webmock, :test, :minitest]
|
48
|
-
|
49
|
-
task :require_ruby_18 do
|
50
|
-
raise "This must be run on Ruby 1.8" unless RUBY_VERSION =~ /^1\.8/
|
51
|
-
end
|
52
|
-
|
53
|
-
task :release => [:require_ruby_18]
|
data/lib/webmock.rb
CHANGED
@@ -52,15 +52,3 @@ require 'webmock/http_lib_adapters/excon_adapter'
|
|
52
52
|
require 'webmock/http_lib_adapters/manticore_adapter'
|
53
53
|
|
54
54
|
require 'webmock/webmock'
|
55
|
-
|
56
|
-
if RUBY_VERSION <= "1.8.7" && Addressable::VERSION::STRING >= "2.4.0"
|
57
|
-
raise StandardError,
|
58
|
-
<<-ERR
|
59
|
-
\n\e[31m
|
60
|
-
Addressable dropped support for Ruby 1.8.7 on version 2.4.0,
|
61
|
-
|
62
|
-
please add the following to your Gemfile to be able to use WebMock:
|
63
|
-
|
64
|
-
gem 'addressable', '< 2.4.0'\e[0m\n
|
65
|
-
ERR
|
66
|
-
end
|
data/lib/webmock/cucumber.rb
CHANGED
@@ -84,8 +84,6 @@ if defined?(Curl)
|
|
84
84
|
|
85
85
|
uri = WebMock::Util::URI.heuristic_parse(self.url)
|
86
86
|
uri.path = uri.normalized_path.gsub("[^:]//","/")
|
87
|
-
uri.user = self.username
|
88
|
-
uri.password = self.password
|
89
87
|
|
90
88
|
request_body = case method
|
91
89
|
when :post
|
@@ -100,11 +98,19 @@ if defined?(Curl)
|
|
100
98
|
method,
|
101
99
|
uri.to_s,
|
102
100
|
:body => request_body,
|
103
|
-
:headers => self.headers
|
101
|
+
:headers => self.headers.merge(basic_auth_headers)
|
104
102
|
)
|
105
103
|
request_signature
|
106
104
|
end
|
107
105
|
|
106
|
+
def basic_auth_headers
|
107
|
+
if self.username
|
108
|
+
{'Authorization' => WebMock::Util::Headers.basic_auth_header(self.username, self.password)}
|
109
|
+
else
|
110
|
+
{}
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
108
114
|
def build_curb_response(webmock_response)
|
109
115
|
raise Curl::Err::TimeoutError if webmock_response.should_timeout
|
110
116
|
webmock_response.raise_error_if_any
|
@@ -1,11 +1,222 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
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
|
+
query = @req.query
|
170
|
+
|
171
|
+
uri.query = encode_query(@req.uri, query).slice(/\?(.*)/, 1)
|
172
|
+
|
173
|
+
body = form_encode_body(body) if body.is_a?(Hash)
|
174
|
+
|
175
|
+
headers = @req.headers
|
176
|
+
|
177
|
+
if headers['authorization']
|
178
|
+
headers['Authorization'] = WebMock::Util::Headers.basic_auth_header(headers.delete('authorization'))
|
179
|
+
end
|
180
|
+
|
181
|
+
WebMock::RequestSignature.new(
|
182
|
+
method.downcase.to_sym,
|
183
|
+
uri.to_s,
|
184
|
+
:body => body || (@req.file && File.read(@req.file)),
|
185
|
+
:headers => headers
|
186
|
+
)
|
187
|
+
end
|
188
|
+
|
189
|
+
def make_raw_response(response)
|
190
|
+
response.raise_error_if_any
|
191
|
+
|
192
|
+
status, headers, body = response.status, response.headers, response.body
|
193
|
+
headers ||= {}
|
194
|
+
|
195
|
+
response_string = []
|
196
|
+
response_string << "HTTP/1.1 #{status[0]} #{status[1]}"
|
197
|
+
|
198
|
+
headers["Content-Length"] = body.bytesize unless headers["Content-Length"]
|
199
|
+
headers.each do |header, value|
|
200
|
+
if header =~ /set-cookie/i
|
201
|
+
[value].flatten.each do |cookie|
|
202
|
+
response_string << "#{header}: #{cookie}"
|
203
|
+
end
|
204
|
+
else
|
205
|
+
value = value.join(", ") if value.is_a?(Array)
|
206
|
+
|
207
|
+
# WebMock's internal processing will not handle the body
|
208
|
+
# correctly if the header indicates that it is chunked, unless
|
209
|
+
# we also create all the chunks.
|
210
|
+
# It's far easier just to remove the header.
|
211
|
+
next if header =~ /transfer-encoding/i && value =~/chunked/i
|
212
|
+
|
213
|
+
response_string << "#{header}: #{value}"
|
214
|
+
end
|
215
|
+
end if headers
|
6
216
|
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
217
|
+
response_string << "" << body
|
218
|
+
response_string.join("\n")
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|
11
222
|
end
|