webmock 1.3.5 → 1.4.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.
- data/CHANGELOG.md +23 -0
- data/README.md +17 -20
- data/Rakefile +4 -3
- data/VERSION +1 -1
- data/lib/webmock.rb +5 -0
- data/lib/webmock/adapters/rspec.rb +12 -9
- data/lib/webmock/adapters/test_unit.rb +1 -6
- data/lib/webmock/api.rb +32 -0
- data/lib/webmock/assertion_failure.rb +13 -0
- data/lib/webmock/deprecation.rb +9 -0
- data/lib/webmock/http_lib_adapters/curb.rb +260 -0
- data/lib/webmock/http_lib_adapters/em_http_request.rb +2 -2
- data/lib/webmock/http_lib_adapters/httpclient.rb +4 -3
- data/lib/webmock/http_lib_adapters/net_http.rb +2 -2
- data/lib/webmock/http_lib_adapters/net_http_response.rb +9 -27
- data/lib/webmock/http_lib_adapters/patron.rb +2 -2
- data/lib/webmock/util/uri.rb +5 -0
- data/lib/webmock/webmock.rb +47 -41
- data/spec/curb_spec.rb +173 -0
- data/spec/curb_spec_helper.rb +137 -0
- data/spec/request_execution_verifier_spec.rb +9 -9
- data/spec/request_pattern_spec.rb +115 -115
- data/spec/request_registry_spec.rb +44 -42
- data/spec/request_signature_spec.rb +6 -6
- data/spec/request_stub_spec.rb +5 -5
- data/spec/response_spec.rb +33 -33
- data/spec/spec_helper.rb +2 -3
- data/spec/util/hash_counter_spec.rb +4 -4
- data/spec/util/headers_spec.rb +4 -4
- data/spec/webmock_spec.rb +67 -54
- data/test/test_helper.rb +2 -2
- data/webmock.gemspec +25 -14
- metadata +34 -29
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,28 @@
|
|
1
1
|
#Changelog
|
2
2
|
|
3
|
+
## 1.4.0
|
4
|
+
|
5
|
+
* Curb support!!! Thanks to the awesome work of Pete Higgins!
|
6
|
+
|
7
|
+
* `include WebMock` is now deprecated to avoid method and constant name conflicts. Please `include WebMock::API` instead.
|
8
|
+
|
9
|
+
* `WebMock::API#request` is renamed to `WebMock::API#a_request` to prevent method name conflicts with i.e. Rails controller specs.
|
10
|
+
WebMock.request is still available.
|
11
|
+
|
12
|
+
* Deprecated `WebMock#request`, `WebMock#allow_net_connect!`, `WebMock#net_connect_allowed?`, `WebMock#registered_request?`, `WebMock#reset_callbacks`, `WebMock#after_request` instance methods. These methods are still available, but only as WebMock class methods.
|
13
|
+
|
14
|
+
* Removed `WebMock.response_for_request` and `WebMock.assertion_failure` which were only used internally and were not documented.
|
15
|
+
|
16
|
+
* :allow_localhost => true' now permits 0.0.0.0 in addition to 127.0.0.1 and 'localhost'. Thanks to Myron Marston and Mike Gehard for suggesting this.
|
17
|
+
|
18
|
+
* Fixed issue with both RSpec 1.x and 2.x being available.
|
19
|
+
|
20
|
+
WebMock now tries to use already loaded version of RSpec (1.x or 2.x). Previously it was loading RSpec 2.0 if available, even if RSpec 1.3 was already loaded.
|
21
|
+
|
22
|
+
Thanks to Hans de Graaff for reporting this.
|
23
|
+
|
24
|
+
* Changed runtime dependency on Addressable version 2.2.2 which fixes handling of percent-escaped '+'
|
25
|
+
|
3
26
|
## 1.3.5
|
4
27
|
|
5
28
|
* External requests can be disabled while allowing selected hosts. Thanks to Charles Li and Ryan Bigg
|
data/README.md
CHANGED
@@ -21,6 +21,7 @@ Supported HTTP libraries
|
|
21
21
|
* HTTPClient
|
22
22
|
* Patron
|
23
23
|
* EM-HTTP-Request
|
24
|
+
* Curb
|
24
25
|
|
25
26
|
##Installation
|
26
27
|
|
@@ -33,7 +34,7 @@ Add the following code to `test/test_helper.rb`
|
|
33
34
|
require 'webmock/test_unit'
|
34
35
|
|
35
36
|
class Test::Unit::TestCase
|
36
|
-
|
37
|
+
include WebMock::API
|
37
38
|
end
|
38
39
|
|
39
40
|
### RSpec
|
@@ -43,7 +44,7 @@ Add the following code to `spec/spec_helper`:
|
|
43
44
|
require 'webmock/rspec'
|
44
45
|
|
45
46
|
Spec::Runner.configure do |config|
|
46
|
-
config.include WebMock
|
47
|
+
config.include WebMock::API
|
47
48
|
end
|
48
49
|
|
49
50
|
### RSpec 2
|
@@ -53,25 +54,20 @@ Add the following code to `spec/spec_helper`:
|
|
53
54
|
require 'webmock/rspec'
|
54
55
|
|
55
56
|
RSpec.configure do |config|
|
56
|
-
config.include WebMock
|
57
|
+
config.include WebMock::API
|
57
58
|
end
|
58
59
|
|
59
60
|
### Cucumber
|
60
61
|
|
61
62
|
Add the following code to `features/support/env.rb`
|
62
63
|
|
63
|
-
require 'webmock/rspec'
|
64
|
-
|
65
|
-
include WebMock
|
66
|
-
include WebMock::Matchers
|
67
|
-
end
|
68
|
-
|
69
|
-
World(WebMockWorld)
|
64
|
+
require 'webmock/rspec'
|
65
|
+
World(WebMock::API, WebMock::Matchers)
|
70
66
|
|
71
67
|
You can also use WebMock outside a test framework:
|
72
68
|
|
73
69
|
require 'webmock'
|
74
|
-
include WebMock
|
70
|
+
include WebMock::API
|
75
71
|
include WebMock::Matchers
|
76
72
|
|
77
73
|
## Examples
|
@@ -357,19 +353,19 @@ You can also use WebMock outside a test framework:
|
|
357
353
|
|
358
354
|
### Different way of setting expectations in RSpec
|
359
355
|
|
360
|
-
|
356
|
+
a_request(:post, "www.example.com").with(:body => "abc", :headers => {'Content-Length' => 3}).should have_been_made.once
|
361
357
|
|
362
|
-
|
358
|
+
a_request(:post, "www.something.com").should have_been_made.times(3)
|
363
359
|
|
364
|
-
|
360
|
+
a_request(:any, "www.example.com").should_not have_been_made
|
365
361
|
|
366
|
-
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
362
|
+
a_request(:post, "www.example.com").with { |req| req.body == "abc" }.should have_been_made
|
363
|
+
|
364
|
+
a_request(:get, "www.example.com").with(:query => {"a" => ["b", "c"]}).should have_been_made
|
365
|
+
|
366
|
+
a_request(:post, "www.example.com").
|
371
367
|
with(:body => {"a" => ["b", "c"]}, :headers => 'Content-Type' => 'application/json').should have_been_made
|
372
|
-
|
368
|
+
|
373
369
|
## Clearing stubs and request history
|
374
370
|
|
375
371
|
If you want to reset all current stubs and history of requests use `WebMock.reset_webmock`
|
@@ -535,6 +531,7 @@ People who submitted patches and new features or suggested improvements. Many th
|
|
535
531
|
* Muness Alrubaie
|
536
532
|
* Charles Li
|
537
533
|
* Ryan Bigg
|
534
|
+
* Pete Higgins
|
538
535
|
|
539
536
|
## Background
|
540
537
|
|
data/Rakefile
CHANGED
@@ -10,12 +10,13 @@ begin
|
|
10
10
|
gem.email = "bartosz.blimke@gmail.com"
|
11
11
|
gem.homepage = "http://github.com/bblimke/webmock"
|
12
12
|
gem.authors = ["Bartosz Blimke"]
|
13
|
-
gem.add_dependency "addressable", ">= 2.
|
13
|
+
gem.add_dependency "addressable", ">= 2.2.2"
|
14
14
|
gem.add_dependency "crack", ">=0.1.7"
|
15
15
|
gem.add_development_dependency "rspec", ">= 1.2.9"
|
16
16
|
gem.add_development_dependency "httpclient", ">= 2.1.5.2"
|
17
|
-
gem.add_development_dependency "patron", ">= 0.4.
|
18
|
-
gem.add_development_dependency "em-http-request", ">= 0.2.
|
17
|
+
gem.add_development_dependency "patron", ">= 0.4.9" unless RUBY_PLATFORM =~ /java/
|
18
|
+
gem.add_development_dependency "em-http-request", ">= 0.2.14" unless RUBY_PLATFORM =~ /java/
|
19
|
+
gem.add_development_dependency "curb", ">= 0.7.8" unless RUBY_PLATFORM =~ /java/
|
19
20
|
end
|
20
21
|
Jeweler::GemcutterTasks.new
|
21
22
|
rescue LoadError
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.4.0
|
data/lib/webmock.rb
CHANGED
@@ -3,9 +3,12 @@ require 'singleton'
|
|
3
3
|
require 'addressable/uri'
|
4
4
|
require 'crack'
|
5
5
|
|
6
|
+
require 'webmock/deprecation'
|
7
|
+
|
6
8
|
require 'webmock/http_lib_adapters/net_http'
|
7
9
|
require 'webmock/http_lib_adapters/httpclient'
|
8
10
|
require 'webmock/http_lib_adapters/patron'
|
11
|
+
require 'webmock/http_lib_adapters/curb'
|
9
12
|
require 'webmock/http_lib_adapters/em_http_request'
|
10
13
|
|
11
14
|
require 'webmock/errors'
|
@@ -20,8 +23,10 @@ require 'webmock/responses_sequence'
|
|
20
23
|
require 'webmock/request_stub'
|
21
24
|
require 'webmock/response'
|
22
25
|
|
26
|
+
require 'webmock/assertion_failure'
|
23
27
|
require 'webmock/request_execution_verifier'
|
24
28
|
require 'webmock/config'
|
25
29
|
require 'webmock/callback_registry'
|
26
30
|
require 'webmock/request_registry'
|
31
|
+
require 'webmock/api'
|
27
32
|
require 'webmock/webmock'
|
@@ -1,13 +1,20 @@
|
|
1
1
|
require 'webmock'
|
2
2
|
|
3
3
|
# RSpec 1.x and 2.x compatibility
|
4
|
-
|
5
|
-
require 'rspec'
|
4
|
+
if defined?(Rspec)
|
6
5
|
RSPEC_NAMESPACE = RSPEC_CONFIGURER = Rspec
|
7
|
-
|
8
|
-
require 'spec'
|
6
|
+
elsif defined?(Spec)
|
9
7
|
RSPEC_NAMESPACE = Spec
|
10
8
|
RSPEC_CONFIGURER = Spec::Runner
|
9
|
+
else
|
10
|
+
begin
|
11
|
+
require 'rspec'
|
12
|
+
RSPEC_NAMESPACE = RSPEC_CONFIGURER = Rspec
|
13
|
+
rescue LoadError
|
14
|
+
require 'spec'
|
15
|
+
RSPEC_NAMESPACE = Spec
|
16
|
+
RSPEC_CONFIGURER = Spec::Runner
|
17
|
+
end
|
11
18
|
end
|
12
19
|
|
13
20
|
require 'webmock/adapters/rspec/request_pattern_matcher'
|
@@ -23,8 +30,4 @@ RSPEC_CONFIGURER.configure { |config|
|
|
23
30
|
end
|
24
31
|
}
|
25
32
|
|
26
|
-
|
27
|
-
def assertion_failure(message)
|
28
|
-
raise RSPEC_NAMESPACE::Expectations::ExpectationNotMetError.new(message)
|
29
|
-
end
|
30
|
-
end
|
33
|
+
WebMock::AssertionFailure.error_class = RSPEC_NAMESPACE::Expectations::ExpectationNotMetError
|
@@ -15,10 +15,5 @@ class Test::Unit::TestCase
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
module WebMock
|
19
|
-
AssertionFailedError = Test::Unit::AssertionFailedError rescue MiniTest::Assertion # ruby1.9 compat
|
20
|
-
def assertion_failure(message)
|
21
|
-
raise AssertionFailedError.new(message)
|
22
|
-
end
|
23
|
-
end
|
24
18
|
|
19
|
+
WebMock::AssertionFailure.error_class = Test::Unit::AssertionFailedError rescue MiniTest::Assertion # ruby1.9 compat
|
data/lib/webmock/api.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
module WebMock
|
2
|
+
module API
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def stub_request(method, uri)
|
6
|
+
WebMock::RequestRegistry.instance.register_request_stub(WebMock::RequestStub.new(method, uri))
|
7
|
+
end
|
8
|
+
|
9
|
+
alias_method :stub_http_request, :stub_request
|
10
|
+
|
11
|
+
def a_request(method, uri)
|
12
|
+
WebMock::RequestPattern.new(method, uri)
|
13
|
+
end
|
14
|
+
|
15
|
+
class << self
|
16
|
+
alias :request :a_request
|
17
|
+
end
|
18
|
+
|
19
|
+
def assert_requested(method, uri, options = {}, &block)
|
20
|
+
expected_times_executed = options.delete(:times) || 1
|
21
|
+
request = WebMock::RequestPattern.new(method, uri, options).with(&block)
|
22
|
+
verifier = WebMock::RequestExecutionVerifier.new(request, expected_times_executed)
|
23
|
+
WebMock::AssertionFailure.failure(verifier.failure_message) unless verifier.matches?
|
24
|
+
end
|
25
|
+
|
26
|
+
def assert_not_requested(method, uri, options = {}, &block)
|
27
|
+
request = WebMock::RequestPattern.new(method, uri, options).with(&block)
|
28
|
+
verifier = WebMock::RequestExecutionVerifier.new(request, options.delete(:times))
|
29
|
+
WebMock::AssertionFailure.failure(verifier.negative_failure_message) unless verifier.does_not_match?
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,260 @@
|
|
1
|
+
if defined?(Curl)
|
2
|
+
|
3
|
+
module Curl
|
4
|
+
class Easy
|
5
|
+
def curb_or_webmock
|
6
|
+
request_signature = build_request_signature
|
7
|
+
WebMock::RequestRegistry.instance.requested_signatures.put(request_signature)
|
8
|
+
|
9
|
+
if WebMock::RequestRegistry.instance.registered_request?(request_signature)
|
10
|
+
webmock_response = WebMock::RequestRegistry.instance.response_for_request(request_signature)
|
11
|
+
build_curb_response(webmock_response)
|
12
|
+
WebMock::CallbackRegistry.invoke_callbacks(
|
13
|
+
{:lib => :curb}, request_signature, webmock_response)
|
14
|
+
invoke_curb_callbacks
|
15
|
+
true
|
16
|
+
elsif WebMock.net_connect_allowed?(request_signature.uri)
|
17
|
+
res = yield
|
18
|
+
if WebMock::CallbackRegistry.any_callbacks?
|
19
|
+
webmock_response = build_webmock_response
|
20
|
+
WebMock::CallbackRegistry.invoke_callbacks(
|
21
|
+
{:lib => :curb, :real_request => true}, request_signature,
|
22
|
+
webmock_response)
|
23
|
+
end
|
24
|
+
res
|
25
|
+
else
|
26
|
+
raise WebMock::NetConnectNotAllowedError.new(request_signature)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def build_request_signature
|
31
|
+
method = @webmock_method.to_s.downcase.to_sym
|
32
|
+
|
33
|
+
uri = WebMock::Util::URI.heuristic_parse(self.url)
|
34
|
+
uri.path = uri.normalized_path.gsub("[^:]//","/")
|
35
|
+
uri.user = self.username
|
36
|
+
uri.password = self.password
|
37
|
+
|
38
|
+
request_body = case method
|
39
|
+
when :post
|
40
|
+
self.post_body || @post_body
|
41
|
+
when :put
|
42
|
+
@put_data
|
43
|
+
else
|
44
|
+
nil
|
45
|
+
end
|
46
|
+
|
47
|
+
request_signature = WebMock::RequestSignature.new(
|
48
|
+
method,
|
49
|
+
uri.to_s,
|
50
|
+
:body => request_body,
|
51
|
+
:headers => self.headers
|
52
|
+
)
|
53
|
+
request_signature
|
54
|
+
end
|
55
|
+
|
56
|
+
def build_curb_response(webmock_response)
|
57
|
+
raise Curl::Err::TimeoutError if webmock_response.should_timeout
|
58
|
+
webmock_response.raise_error_if_any
|
59
|
+
|
60
|
+
@body_str = webmock_response.body
|
61
|
+
@response_code = webmock_response.status[0]
|
62
|
+
|
63
|
+
@header_str = "HTTP/1.1 #{webmock_response.status[0]} #{webmock_response.status[1]}\r\n"
|
64
|
+
if webmock_response.headers
|
65
|
+
@header_str << webmock_response.headers.map do |k,v|
|
66
|
+
"#{k}: #{v.is_a?(Array) ? v.join(", ") : v}"
|
67
|
+
end.join("\r\n")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def invoke_curb_callbacks
|
72
|
+
@on_progress.call(0.0,1.0,0.0,1.0) if @on_progress
|
73
|
+
@on_header.call(self.header_str) if @on_header
|
74
|
+
@on_body.call(self.body_str) if @on_body
|
75
|
+
@on_complete.call(self) if @on_complete
|
76
|
+
|
77
|
+
case response_code
|
78
|
+
when 200..299
|
79
|
+
@on_success.call(self) if @on_success
|
80
|
+
when 500..599
|
81
|
+
@on_failure.call(self, self.response_code) if @on_failure
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def build_webmock_response
|
86
|
+
status, headers = WebmockHelper.parse_header_string(self.header_str)
|
87
|
+
|
88
|
+
webmock_response = WebMock::Response.new
|
89
|
+
webmock_response.status = [self.response_code, status]
|
90
|
+
webmock_response.body = self.body_str
|
91
|
+
webmock_response.headers = headers
|
92
|
+
webmock_response
|
93
|
+
end
|
94
|
+
|
95
|
+
###
|
96
|
+
### Mocks of Curl::Easy methods below here.
|
97
|
+
###
|
98
|
+
|
99
|
+
def http_with_webmock(method)
|
100
|
+
@webmock_method = method
|
101
|
+
curb_or_webmock do
|
102
|
+
http_without_webmock(method)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
alias_method :http_without_webmock, :http
|
106
|
+
alias_method :http, :http_with_webmock
|
107
|
+
|
108
|
+
%w[ get head delete ].each do |verb|
|
109
|
+
define_method "http_#{verb}_with_webmock" do
|
110
|
+
@webmock_method = verb
|
111
|
+
curb_or_webmock do
|
112
|
+
send( "http_#{verb}_without_webmock" )
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
alias_method "http_#{verb}_without_webmock", "http_#{verb}"
|
117
|
+
alias_method "http_#{verb}", "http_#{verb}_with_webmock"
|
118
|
+
end
|
119
|
+
|
120
|
+
def http_put_with_webmock data
|
121
|
+
@webmock_method = :put
|
122
|
+
@put_data = data
|
123
|
+
curb_or_webmock do
|
124
|
+
http_put_without_webmock(data)
|
125
|
+
end
|
126
|
+
end
|
127
|
+
alias_method :http_put_without_webmock, :http_put
|
128
|
+
alias_method :http_put, :http_put_with_webmock
|
129
|
+
|
130
|
+
def http_post_with_webmock data
|
131
|
+
@webmock_method = :post
|
132
|
+
@post_body = data
|
133
|
+
curb_or_webmock do
|
134
|
+
http_post_without_webmock(data)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
alias_method :http_post_without_webmock, :http_post
|
138
|
+
alias_method :http_post, :http_post_with_webmock
|
139
|
+
|
140
|
+
|
141
|
+
def perform_with_webmock
|
142
|
+
@webmock_method ||= :get
|
143
|
+
curb_or_webmock do
|
144
|
+
perform_without_webmock
|
145
|
+
end
|
146
|
+
end
|
147
|
+
alias :perform_without_webmock :perform
|
148
|
+
alias :perform :perform_with_webmock
|
149
|
+
|
150
|
+
def put_data_with_webmock= data
|
151
|
+
@webmock_method = :put
|
152
|
+
@put_data = data
|
153
|
+
self.put_data_without_webmock = data
|
154
|
+
end
|
155
|
+
alias_method :put_data_without_webmock=, :put_data=
|
156
|
+
alias_method :put_data=, :put_data_with_webmock=
|
157
|
+
|
158
|
+
def post_body_with_webmock= data
|
159
|
+
@webmock_method = :post
|
160
|
+
self.post_body_without_webmock = data
|
161
|
+
end
|
162
|
+
alias_method :post_body_without_webmock=, :post_body=
|
163
|
+
alias_method :post_body=, :post_body_with_webmock=
|
164
|
+
|
165
|
+
def delete_with_webmock= value
|
166
|
+
@webmock_method = :delete if value
|
167
|
+
self.delete_without_webmock = value
|
168
|
+
end
|
169
|
+
alias_method :delete_without_webmock=, :delete=
|
170
|
+
alias_method :delete=, :delete_with_webmock=
|
171
|
+
|
172
|
+
def head_with_webmock= value
|
173
|
+
@webmock_method = :head if value
|
174
|
+
self.head_without_webmock = value
|
175
|
+
end
|
176
|
+
alias_method :head_without_webmock=, :head=
|
177
|
+
alias_method :head=, :head_with_webmock=
|
178
|
+
|
179
|
+
def body_str_with_webmock
|
180
|
+
@body_str || body_str_without_webmock
|
181
|
+
end
|
182
|
+
alias :body_str_without_webmock :body_str
|
183
|
+
alias :body_str :body_str_with_webmock
|
184
|
+
|
185
|
+
def response_code_with_webmock
|
186
|
+
@response_code || response_code_without_webmock
|
187
|
+
end
|
188
|
+
alias :response_code_without_webmock :response_code
|
189
|
+
alias :response_code :response_code_with_webmock
|
190
|
+
|
191
|
+
def header_str_with_webmock
|
192
|
+
@header_str || header_str_without_webmock
|
193
|
+
end
|
194
|
+
alias :header_str_without_webmock :header_str
|
195
|
+
alias :header_str :header_str_with_webmock
|
196
|
+
|
197
|
+
%w[ success failure header body complete progress ].each do |callback|
|
198
|
+
class_eval <<-METHOD, __FILE__, __LINE__
|
199
|
+
def on_#{callback}_with_webmock &block
|
200
|
+
@on_#{callback} = block
|
201
|
+
on_#{callback}_without_webmock &block
|
202
|
+
end
|
203
|
+
METHOD
|
204
|
+
alias_method "on_#{callback}_without_webmock", "on_#{callback}"
|
205
|
+
alias_method "on_#{callback}", "on_#{callback}_with_webmock"
|
206
|
+
end
|
207
|
+
|
208
|
+
%w[ http_get http_head http_delete perform ].each do |method|
|
209
|
+
class_eval <<-METHOD, __FILE__, __LINE__
|
210
|
+
def self.#{method}(url, &block)
|
211
|
+
c = new
|
212
|
+
c.url = url
|
213
|
+
block.call(c) if block
|
214
|
+
c.send("#{method}")
|
215
|
+
c
|
216
|
+
end
|
217
|
+
METHOD
|
218
|
+
end
|
219
|
+
|
220
|
+
%w[ put post ].each do |verb|
|
221
|
+
class_eval <<-METHOD, __FILE__, __LINE__
|
222
|
+
def self.http_#{verb}(url, data, &block)
|
223
|
+
c = new
|
224
|
+
c.url = url
|
225
|
+
block.call(c) if block
|
226
|
+
c.send("http_#{verb}", data)
|
227
|
+
c
|
228
|
+
end
|
229
|
+
METHOD
|
230
|
+
end
|
231
|
+
|
232
|
+
module WebmockHelper
|
233
|
+
# Borrowed from Patron:
|
234
|
+
# http://github.com/toland/patron/blob/master/lib/patron/response.rb
|
235
|
+
def self.parse_header_string(header_string)
|
236
|
+
status, headers = nil, {}
|
237
|
+
|
238
|
+
header_string.split(/\r\n/).each do |header|
|
239
|
+
if header =~ %r|^HTTP/1.[01] \d\d\d (.*)|
|
240
|
+
status = $1
|
241
|
+
else
|
242
|
+
parts = header.split(':', 2)
|
243
|
+
unless parts.empty?
|
244
|
+
parts[1].strip! unless parts[1].nil?
|
245
|
+
if headers.has_key?(parts[0])
|
246
|
+
headers[parts[0]] = [headers[parts[0]]] unless headers[parts[0]].kind_of? Array
|
247
|
+
headers[parts[0]] << parts[1]
|
248
|
+
else
|
249
|
+
headers[parts[0]] = parts[1]
|
250
|
+
end
|
251
|
+
end
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
return status, headers
|
256
|
+
end
|
257
|
+
end
|
258
|
+
end
|
259
|
+
end
|
260
|
+
end
|