webmock 1.3.5 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|