webmock 3.14.0 → 3.25.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +213 -3
- data/README.md +66 -20
- data/lib/webmock/api.rb +2 -0
- data/lib/webmock/assertion_failure.rb +2 -0
- data/lib/webmock/callback_registry.rb +2 -0
- data/lib/webmock/config.rb +2 -0
- data/lib/webmock/cucumber.rb +2 -0
- data/lib/webmock/deprecation.rb +2 -0
- data/lib/webmock/errors.rb +2 -0
- data/lib/webmock/http_lib_adapters/async_http_client_adapter.rb +16 -4
- data/lib/webmock/http_lib_adapters/curb_adapter.rb +4 -2
- data/lib/webmock/http_lib_adapters/em_http_request_adapter.rb +17 -7
- data/lib/webmock/http_lib_adapters/excon_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_lib_adapter_registry.rb +2 -0
- data/lib/webmock/http_lib_adapters/http_rb/client.rb +3 -3
- data/lib/webmock/http_lib_adapters/http_rb/request.rb +17 -5
- data/lib/webmock/http_lib_adapters/http_rb/response.rb +32 -9
- data/lib/webmock/http_lib_adapters/http_rb/streamer.rb +10 -2
- data/lib/webmock/http_lib_adapters/http_rb/webmock.rb +8 -2
- data/lib/webmock/http_lib_adapters/http_rb_adapter.rb +7 -5
- data/lib/webmock/http_lib_adapters/httpclient_adapter.rb +26 -25
- data/lib/webmock/http_lib_adapters/manticore_adapter.rb +2 -0
- data/lib/webmock/http_lib_adapters/net_http.rb +46 -121
- data/lib/webmock/http_lib_adapters/net_http_response.rb +2 -0
- data/lib/webmock/http_lib_adapters/patron_adapter.rb +3 -1
- data/lib/webmock/http_lib_adapters/typhoeus_hydra_adapter.rb +18 -2
- data/lib/webmock/matchers/any_arg_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_argument_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_excluding_matcher.rb +2 -0
- data/lib/webmock/matchers/hash_including_matcher.rb +2 -0
- data/lib/webmock/minitest.rb +2 -0
- data/lib/webmock/rack_response.rb +5 -1
- data/lib/webmock/request_body_diff.rb +2 -0
- data/lib/webmock/request_execution_verifier.rb +2 -0
- data/lib/webmock/request_pattern.rb +35 -12
- data/lib/webmock/request_registry.rb +2 -0
- data/lib/webmock/request_signature.rb +4 -2
- data/lib/webmock/request_signature_snippet.rb +2 -0
- data/lib/webmock/request_stub.rb +34 -0
- data/lib/webmock/response.rb +15 -13
- data/lib/webmock/responses_sequence.rb +2 -0
- data/lib/webmock/rspec/matchers/request_pattern_matcher.rb +2 -0
- data/lib/webmock/rspec/matchers/webmock_matcher.rb +2 -0
- data/lib/webmock/rspec/matchers.rb +2 -0
- data/lib/webmock/rspec.rb +2 -0
- data/lib/webmock/stub_registry.rb +2 -0
- data/lib/webmock/stub_request_snippet.rb +2 -0
- data/lib/webmock/test_unit.rb +2 -0
- data/lib/webmock/util/hash_counter.rb +12 -6
- data/lib/webmock/util/hash_keys_stringifier.rb +2 -0
- data/lib/webmock/util/hash_validator.rb +2 -0
- data/lib/webmock/util/headers.rb +23 -10
- data/lib/webmock/util/parsers/json.rb +72 -0
- data/lib/webmock/util/parsers/parse_error.rb +7 -0
- data/lib/webmock/util/parsers/xml.rb +16 -0
- data/lib/webmock/util/query_mapper.rb +2 -0
- data/lib/webmock/util/uri.rb +3 -1
- data/lib/webmock/util/values_stringifier.rb +2 -0
- data/lib/webmock/util/version_checker.rb +7 -5
- data/lib/webmock/version.rb +3 -1
- data/lib/webmock/webmock.rb +12 -0
- data/lib/webmock.rb +4 -2
- metadata +66 -185
- data/.gemtest +0 -0
- data/.github/workflows/CI.yml +0 -37
- data/.gitignore +0 -34
- data/.rspec-tm +0 -2
- data/Gemfile +0 -9
- data/Rakefile +0 -38
- data/lib/webmock/util/json.rb +0 -67
- data/minitest/test_helper.rb +0 -34
- data/minitest/test_webmock.rb +0 -9
- data/minitest/webmock_spec.rb +0 -60
- data/spec/acceptance/async_http_client/async_http_client_spec.rb +0 -375
- data/spec/acceptance/async_http_client/async_http_client_spec_helper.rb +0 -73
- data/spec/acceptance/curb/curb_spec.rb +0 -499
- data/spec/acceptance/curb/curb_spec_helper.rb +0 -147
- data/spec/acceptance/em_http_request/em_http_request_spec.rb +0 -462
- data/spec/acceptance/em_http_request/em_http_request_spec_helper.rb +0 -77
- data/spec/acceptance/excon/excon_spec.rb +0 -77
- data/spec/acceptance/excon/excon_spec_helper.rb +0 -52
- data/spec/acceptance/http_rb/http_rb_spec.rb +0 -93
- data/spec/acceptance/http_rb/http_rb_spec_helper.rb +0 -54
- data/spec/acceptance/httpclient/httpclient_spec.rb +0 -217
- data/spec/acceptance/httpclient/httpclient_spec_helper.rb +0 -57
- data/spec/acceptance/manticore/manticore_spec.rb +0 -107
- data/spec/acceptance/manticore/manticore_spec_helper.rb +0 -35
- data/spec/acceptance/net_http/net_http_shared.rb +0 -153
- data/spec/acceptance/net_http/net_http_spec.rb +0 -369
- data/spec/acceptance/net_http/net_http_spec_helper.rb +0 -64
- data/spec/acceptance/net_http/real_net_http_spec.rb +0 -20
- data/spec/acceptance/patron/patron_spec.rb +0 -125
- data/spec/acceptance/patron/patron_spec_helper.rb +0 -54
- data/spec/acceptance/shared/allowing_and_disabling_net_connect.rb +0 -313
- data/spec/acceptance/shared/callbacks.rb +0 -148
- data/spec/acceptance/shared/complex_cross_concern_behaviors.rb +0 -36
- data/spec/acceptance/shared/enabling_and_disabling_webmock.rb +0 -95
- data/spec/acceptance/shared/precedence_of_stubs.rb +0 -15
- data/spec/acceptance/shared/request_expectations.rb +0 -930
- data/spec/acceptance/shared/returning_declared_responses.rb +0 -409
- data/spec/acceptance/shared/stubbing_requests.rb +0 -678
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec.rb +0 -135
- data/spec/acceptance/typhoeus/typhoeus_hydra_spec_helper.rb +0 -60
- data/spec/acceptance/webmock_shared.rb +0 -41
- data/spec/fixtures/test.txt +0 -1
- data/spec/quality_spec.rb +0 -84
- data/spec/spec_helper.rb +0 -48
- data/spec/support/example_curl_output.txt +0 -22
- data/spec/support/failures.rb +0 -9
- data/spec/support/my_rack_app.rb +0 -53
- data/spec/support/network_connection.rb +0 -19
- data/spec/support/webmock_server.rb +0 -70
- data/spec/unit/api_spec.rb +0 -175
- data/spec/unit/errors_spec.rb +0 -129
- data/spec/unit/http_lib_adapters/http_lib_adapter_registry_spec.rb +0 -17
- data/spec/unit/http_lib_adapters/http_lib_adapter_spec.rb +0 -12
- data/spec/unit/matchers/hash_excluding_matcher_spec.rb +0 -61
- data/spec/unit/matchers/hash_including_matcher_spec.rb +0 -87
- data/spec/unit/rack_response_spec.rb +0 -112
- data/spec/unit/request_body_diff_spec.rb +0 -90
- data/spec/unit/request_execution_verifier_spec.rb +0 -208
- data/spec/unit/request_pattern_spec.rb +0 -736
- data/spec/unit/request_registry_spec.rb +0 -95
- data/spec/unit/request_signature_snippet_spec.rb +0 -89
- data/spec/unit/request_signature_spec.rb +0 -155
- data/spec/unit/request_stub_spec.rb +0 -199
- data/spec/unit/response_spec.rb +0 -286
- data/spec/unit/stub_registry_spec.rb +0 -103
- data/spec/unit/stub_request_snippet_spec.rb +0 -115
- data/spec/unit/util/hash_counter_spec.rb +0 -39
- data/spec/unit/util/hash_keys_stringifier_spec.rb +0 -27
- data/spec/unit/util/headers_spec.rb +0 -28
- data/spec/unit/util/json_spec.rb +0 -33
- data/spec/unit/util/query_mapper_spec.rb +0 -157
- data/spec/unit/util/uri_spec.rb +0 -371
- data/spec/unit/util/version_checker_spec.rb +0 -65
- data/spec/unit/webmock_spec.rb +0 -60
- data/test/http_request.rb +0 -24
- data/test/shared_test.rb +0 -108
- data/test/test_helper.rb +0 -23
- data/test/test_webmock.rb +0 -12
- data/webmock.gemspec +0 -54
@@ -1,153 +0,0 @@
|
|
1
|
-
shared_examples_for "Net::HTTP" do
|
2
|
-
describe "when making real requests", net_connect: true do
|
3
|
-
let(:port){ WebMockServer.instance.port }
|
4
|
-
|
5
|
-
before(:each) do
|
6
|
-
@http = Net::HTTP.new("localhost", port)
|
7
|
-
end
|
8
|
-
|
9
|
-
it "should return a Net::ReadAdapter from response.body when a real request is made with a block and #read_body", net_connect: true do
|
10
|
-
response = Net::HTTP.new("localhost", port).request_get('/') { |r| r.read_body { } }
|
11
|
-
expect(response.body).to be_a(Net::ReadAdapter)
|
12
|
-
end
|
13
|
-
|
14
|
-
it "should handle requests with block passed to read_body", net_connect: true do
|
15
|
-
body = "".dup
|
16
|
-
req = Net::HTTP::Get.new("/")
|
17
|
-
Net::HTTP.start("localhost", port) do |http|
|
18
|
-
http.request(req) do |res|
|
19
|
-
res.read_body do |str|
|
20
|
-
body << str
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
expect(body).to match(/hello world/)
|
25
|
-
end
|
26
|
-
|
27
|
-
it "should connect only once when connected on start", net_connect: true do
|
28
|
-
@http = Net::HTTP.new('localhost', port)
|
29
|
-
socket_id_before_request = socket_id_after_request = nil
|
30
|
-
@http.start {|conn|
|
31
|
-
socket_id_before_request = conn.instance_variable_get(:@socket).object_id
|
32
|
-
conn.request(Net::HTTP::Get.new("/"))
|
33
|
-
socket_id_after_request = conn.instance_variable_get(:@socket).object_id
|
34
|
-
}
|
35
|
-
|
36
|
-
if !defined?(WebMock::Config) || WebMock::Config.instance.net_http_connect_on_start
|
37
|
-
expect(socket_id_before_request).not_to eq(nil.object_id)
|
38
|
-
expect(socket_id_after_request).not_to eq(nil.object_id)
|
39
|
-
expect(socket_id_after_request).to eq(socket_id_before_request)
|
40
|
-
else
|
41
|
-
expect(socket_id_before_request).to eq(nil.object_id)
|
42
|
-
expect(socket_id_after_request).not_to eq(nil.object_id)
|
43
|
-
end
|
44
|
-
end
|
45
|
-
|
46
|
-
it "should pass the read_timeout value on", net_connect: true do
|
47
|
-
@http = Net::HTTP.new('localhost', port)
|
48
|
-
read_timeout = @http.read_timeout + 1
|
49
|
-
@http.read_timeout = read_timeout
|
50
|
-
@http.start {|conn|
|
51
|
-
conn.request(Net::HTTP::Get.new("/"))
|
52
|
-
socket = conn.instance_variable_get(:@socket)
|
53
|
-
expect(socket.read_timeout).to eq(read_timeout)
|
54
|
-
}
|
55
|
-
end
|
56
|
-
|
57
|
-
describe "without start" do
|
58
|
-
it "should close connection after a real request" do
|
59
|
-
@http.get('/') { }
|
60
|
-
expect(@http).not_to be_started
|
61
|
-
end
|
62
|
-
|
63
|
-
it "should execute block exactly once" do
|
64
|
-
times = 0
|
65
|
-
@http.get('/') { times += 1 }
|
66
|
-
expect(times).to eq(1)
|
67
|
-
end
|
68
|
-
|
69
|
-
it "should have socket open during a real request" do
|
70
|
-
socket_id = nil
|
71
|
-
@http.get('/') {
|
72
|
-
socket_id = @http.instance_variable_get(:@socket).object_id
|
73
|
-
}
|
74
|
-
expect(socket_id).not_to be_nil
|
75
|
-
end
|
76
|
-
|
77
|
-
it "should be started during a real request" do
|
78
|
-
started = nil
|
79
|
-
@http.get('/') {
|
80
|
-
started = @http.started?
|
81
|
-
}
|
82
|
-
expect(started).to eq(true)
|
83
|
-
expect(@http.started?).to eq(false)
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
describe "with start" do
|
88
|
-
it "should close connection after a real request" do
|
89
|
-
@http.start {|conn| conn.get('/') { } }
|
90
|
-
expect(@http).not_to be_started
|
91
|
-
end
|
92
|
-
|
93
|
-
it "should execute block exactly once" do
|
94
|
-
times = 0
|
95
|
-
@http.start {|conn| conn.get('/') { times += 1 }}
|
96
|
-
expect(times).to eq(1)
|
97
|
-
end
|
98
|
-
|
99
|
-
it "should have socket open during a real request" do
|
100
|
-
socket_id = nil
|
101
|
-
@http.start {|conn| conn.get('/') {
|
102
|
-
socket_id = conn.instance_variable_get(:@socket).object_id
|
103
|
-
}
|
104
|
-
}
|
105
|
-
expect(socket_id).not_to be_nil
|
106
|
-
end
|
107
|
-
|
108
|
-
it "should be started during a real request" do
|
109
|
-
started = nil
|
110
|
-
@http.start {|conn| conn.get('/') {
|
111
|
-
started = conn.started?
|
112
|
-
}
|
113
|
-
}
|
114
|
-
expect(started).to eq(true)
|
115
|
-
expect(@http.started?).to eq(false)
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
describe "with start without request block" do
|
120
|
-
it "should close connection after a real request" do
|
121
|
-
@http.start {|conn| conn.get('/') }
|
122
|
-
expect(@http).not_to be_started
|
123
|
-
end
|
124
|
-
|
125
|
-
it "should have socket open during a real request" do
|
126
|
-
socket_id = nil
|
127
|
-
@http.start {|conn|
|
128
|
-
socket_id = conn.instance_variable_get(:@socket).object_id
|
129
|
-
}
|
130
|
-
expect(socket_id).not_to be_nil
|
131
|
-
end
|
132
|
-
|
133
|
-
it "should be started during a real request" do
|
134
|
-
started = nil
|
135
|
-
@http.start {|conn|
|
136
|
-
started = conn.started?
|
137
|
-
}
|
138
|
-
expect(started).to eq(true)
|
139
|
-
expect(@http.started?).to eq(false)
|
140
|
-
end
|
141
|
-
end
|
142
|
-
|
143
|
-
describe "with start without a block and finish" do
|
144
|
-
it "should gracefully start and close connection" do
|
145
|
-
@http.start
|
146
|
-
@http.get("/")
|
147
|
-
expect(@http).to be_started
|
148
|
-
@http.finish
|
149
|
-
expect(@http).not_to be_started
|
150
|
-
end
|
151
|
-
end
|
152
|
-
end
|
153
|
-
end
|
@@ -1,369 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
require 'ostruct'
|
3
|
-
require 'acceptance/webmock_shared'
|
4
|
-
require 'acceptance/net_http/net_http_spec_helper'
|
5
|
-
require 'acceptance/net_http/net_http_shared'
|
6
|
-
|
7
|
-
include NetHTTPSpecHelper
|
8
|
-
|
9
|
-
describe "Net:HTTP" do
|
10
|
-
include_examples "with WebMock", :no_url_auth
|
11
|
-
|
12
|
-
let(:port) { WebMockServer.instance.port }
|
13
|
-
|
14
|
-
describe "marshalling" do
|
15
|
-
class TestMarshalingInWebMockNetHTTP
|
16
|
-
attr_accessor :r
|
17
|
-
end
|
18
|
-
before(:each) do
|
19
|
-
@b = TestMarshalingInWebMockNetHTTP.new
|
20
|
-
end
|
21
|
-
after(:each) do
|
22
|
-
WebMock.enable!
|
23
|
-
end
|
24
|
-
it "should be possible to load object marshalled when webmock was disabled" do
|
25
|
-
WebMock.disable!
|
26
|
-
original_constants = [
|
27
|
-
Net::HTTP::Get,
|
28
|
-
Net::HTTP::Post,
|
29
|
-
Net::HTTP::Put,
|
30
|
-
Net::HTTP::Delete,
|
31
|
-
Net::HTTP::Head,
|
32
|
-
Net::HTTP::Options
|
33
|
-
]
|
34
|
-
@b.r = original_constants
|
35
|
-
original_serialized = Marshal.dump(@b)
|
36
|
-
Marshal.load(original_serialized)
|
37
|
-
WebMock.enable!
|
38
|
-
Marshal.load(original_serialized)
|
39
|
-
end
|
40
|
-
|
41
|
-
it "should be possible to load object marshalled when webmock was enabled" do
|
42
|
-
WebMock.enable!
|
43
|
-
new_constants = [
|
44
|
-
Net::HTTP::Get,
|
45
|
-
Net::HTTP::Post,
|
46
|
-
Net::HTTP::Put,
|
47
|
-
Net::HTTP::Delete,
|
48
|
-
Net::HTTP::Head,
|
49
|
-
Net::HTTP::Options
|
50
|
-
]
|
51
|
-
@b.r = new_constants
|
52
|
-
new_serialized = Marshal.dump(@b)
|
53
|
-
Marshal.load(new_serialized)
|
54
|
-
WebMock.disable!
|
55
|
-
Marshal.load(new_serialized)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
describe "constants" do
|
60
|
-
it "should still have const Get defined on replaced Net::HTTP" do
|
61
|
-
expect(Object.const_get("Net").const_get("HTTP").const_defined?("Get")).to be_truthy
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should still have const Get within constants on replaced Net::HTTP" do
|
65
|
-
expect(Object.const_get("Net").const_get("HTTP").constants.map(&:to_s)).to include("Get")
|
66
|
-
end
|
67
|
-
|
68
|
-
it "should still have const Get within constants on replaced Net::HTTP" do
|
69
|
-
expect(Object.const_get("Net").const_get("HTTP").const_get("Get")).not_to be_nil
|
70
|
-
end
|
71
|
-
|
72
|
-
if Module.method(:const_defined?).arity != 1
|
73
|
-
it "should still have const Get defined (and not inherited) on replaced Net::HTTP" do
|
74
|
-
expect(Object.const_get("Net").const_get("HTTP").const_defined?("Get", false)).to be_truthy
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
if Module.method(:const_get).arity != 1
|
79
|
-
it "should still be able to get non inherited constant Get on replaced Net::HTTP" do
|
80
|
-
expect(Object.const_get("Net").const_get("HTTP").const_get("Get", false)).not_to be_nil
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
if Module.method(:constants).arity != 0
|
85
|
-
it "should still Get within non inherited constants on replaced Net::HTTP" do
|
86
|
-
expect(Object.const_get("Net").const_get("HTTP").constants(false).map(&:to_s)).to include("Get")
|
87
|
-
end
|
88
|
-
end
|
89
|
-
|
90
|
-
describe "after WebMock is disabled" do
|
91
|
-
after(:each) do
|
92
|
-
WebMock.enable!
|
93
|
-
end
|
94
|
-
it "Net::HTTP should have the same constants" do
|
95
|
-
orig_consts_number = WebMock::HttpLibAdapters::NetHttpAdapter::OriginalNetHTTP.constants.size
|
96
|
-
Net::HTTP.send(:const_set, "TEST_CONST", 10)
|
97
|
-
expect(Net::HTTP.constants.size).to eq(orig_consts_number + 1)
|
98
|
-
WebMock.disable!
|
99
|
-
expect(Net::HTTP.constants.size).to eq(orig_consts_number + 1)
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
|
104
|
-
it "should work with block provided" do
|
105
|
-
stub_http_request(:get, "www.example.com").to_return(body: "abc"*100000)
|
106
|
-
expect(Net::HTTP.start("www.example.com") { |query| query.get("/") }.body).to eq("abc"*100000)
|
107
|
-
end
|
108
|
-
|
109
|
-
it "should handle requests with raw binary data" do
|
110
|
-
body = "\x14\x00\x00\x00\x70\x69\x6e\x67\x00\x00"
|
111
|
-
stub_http_request(:post, "www.example.com").with(body: body).to_return(body: "abc")
|
112
|
-
req = Net::HTTP::Post.new("/")
|
113
|
-
req.body = body
|
114
|
-
req.content_type = "application/octet-stream"
|
115
|
-
expect(Net::HTTP.start("www.example.com") { |http| http.request(req)}.body).to eq("abc")
|
116
|
-
end
|
117
|
-
|
118
|
-
it "raises an ArgumentError if passed headers as symbols if RUBY_VERSION < 2.3.0" do
|
119
|
-
uri = URI.parse("http://google.com/")
|
120
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
121
|
-
request = Net::HTTP::Get.new(uri.request_uri)
|
122
|
-
|
123
|
-
# Net::HTTP calls downcase on header keys assigned with []=
|
124
|
-
# In Ruby 1.8.7 symbols do not respond to downcase
|
125
|
-
#
|
126
|
-
# Meaning you can not assign header keys as symbols in ruby 1.8.7 using []=
|
127
|
-
if :symbol.respond_to?(:downcase)
|
128
|
-
request[:InvalidHeaderSinceItsASymbol] = "this will not be valid"
|
129
|
-
else
|
130
|
-
request.instance_eval do
|
131
|
-
@header = request.to_hash.merge({InvalidHeaderSinceItsASymbol: "this will not be valid"})
|
132
|
-
end
|
133
|
-
end
|
134
|
-
|
135
|
-
if Gem::Version.new(RUBY_VERSION.dup) < Gem::Version.new('2.3.0')
|
136
|
-
expect do
|
137
|
-
http.request(request)
|
138
|
-
end.to raise_error ArgumentError, "Net:HTTP does not accept headers as symbols"
|
139
|
-
else
|
140
|
-
stub_http_request(:get, "google.com").with(headers: { InvalidHeaderSinceItsASymbol: "this will not be valid" })
|
141
|
-
expect do
|
142
|
-
http.request(request)
|
143
|
-
end.not_to raise_error
|
144
|
-
end
|
145
|
-
end
|
146
|
-
|
147
|
-
it "should handle multiple values for the same response header" do
|
148
|
-
stub_http_request(:get, "www.example.com").to_return(headers: { 'Set-Cookie' => ['foo=bar', 'bar=bazz'] })
|
149
|
-
response = Net::HTTP.get_response(URI.parse("http://www.example.com/"))
|
150
|
-
expect(response.get_fields('Set-Cookie')).to eq(['bar=bazz', 'foo=bar'])
|
151
|
-
end
|
152
|
-
|
153
|
-
it "should yield block on response" do
|
154
|
-
stub_http_request(:get, "www.example.com").to_return(body: "abc")
|
155
|
-
response_body = ""
|
156
|
-
http_request(:get, "http://www.example.com/") do |response|
|
157
|
-
response_body = response.body
|
158
|
-
end
|
159
|
-
expect(response_body).to eq("abc")
|
160
|
-
end
|
161
|
-
|
162
|
-
it "should handle Net::HTTP::Post#body" do
|
163
|
-
stub_http_request(:post, "www.example.com").with(body: "my_params").to_return(body: "abc")
|
164
|
-
req = Net::HTTP::Post.new("/")
|
165
|
-
req.body = "my_params"
|
166
|
-
expect(Net::HTTP.start("www.example.com") { |http| http.request(req)}.body).to eq("abc")
|
167
|
-
end
|
168
|
-
|
169
|
-
it "should handle Net::HTTP::Post#body_stream" do
|
170
|
-
stub_http_request(:post, "www.example.com").with(body: "my_params").to_return(body: "abc")
|
171
|
-
req = Net::HTTP::Post.new("/")
|
172
|
-
req.body_stream = StringIO.new("my_params")
|
173
|
-
expect(Net::HTTP.start("www.example.com") { |http| http.request(req)}.body).to eq("abc")
|
174
|
-
end
|
175
|
-
|
176
|
-
it "should behave like Net::HTTP and raise error if both request body and body argument are set" do
|
177
|
-
stub_http_request(:post, "www.example.com").with(body: "my_params").to_return(body: "abc")
|
178
|
-
req = Net::HTTP::Post.new("/")
|
179
|
-
req.body = "my_params"
|
180
|
-
expect {
|
181
|
-
Net::HTTP.start("www.example.com") { |http| http.request(req, "my_params")}
|
182
|
-
}.to raise_error("both of body argument and HTTPRequest#body set")
|
183
|
-
end
|
184
|
-
|
185
|
-
it "should return a Net::ReadAdapter from response.body when a stubbed request is made with a block and #read_body" do
|
186
|
-
WebMock.stub_request(:get, 'http://example.com/').to_return(body: "the body")
|
187
|
-
response = Net::HTTP.new('example.com', 80).request_get('/') { |r| r.read_body { } }
|
188
|
-
expect(response.body).to be_a(Net::ReadAdapter)
|
189
|
-
end
|
190
|
-
|
191
|
-
it "should have request 1 time executed in registry after 1 real request", net_connect: true do
|
192
|
-
WebMock.allow_net_connect!
|
193
|
-
http = Net::HTTP.new('localhost', port)
|
194
|
-
http.get('/') {}
|
195
|
-
expect(WebMock::RequestRegistry.instance.requested_signatures.hash.size).to eq(1)
|
196
|
-
expect(WebMock::RequestRegistry.instance.requested_signatures.hash.values.first).to eq(1)
|
197
|
-
end
|
198
|
-
|
199
|
-
it "should work with Addressable::URI passed to Net::HTTP.get_response" do
|
200
|
-
stub_request(:get, 'http://www.example.com/hello?a=1').to_return(body: "abc")
|
201
|
-
expect(Net::HTTP.get_response(Addressable::URI.parse('http://www.example.com/hello?a=1')).body).to eq("abc")
|
202
|
-
end
|
203
|
-
|
204
|
-
it "should support method calls on stubbed socket" do
|
205
|
-
WebMock.allow_net_connect!
|
206
|
-
stub_request(:get, 'www.google.com')#.with(headers: {"My-Header" => 99})
|
207
|
-
req = Net::HTTP::Get.new('/')
|
208
|
-
Net::HTTP.start('www.google.com') do |http|
|
209
|
-
http.request(req, '')
|
210
|
-
socket = http.instance_variable_get(:@socket)
|
211
|
-
expect(socket).to be_a(StubSocket)
|
212
|
-
expect { socket.io.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) }.to_not raise_error
|
213
|
-
end
|
214
|
-
end
|
215
|
-
|
216
|
-
describe "connecting on Net::HTTP.start" do
|
217
|
-
before(:each) do
|
218
|
-
@http = Net::HTTP.new('www.google.com', 443)
|
219
|
-
@http.use_ssl = true
|
220
|
-
@http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
221
|
-
end
|
222
|
-
|
223
|
-
describe "when net http is allowed" do
|
224
|
-
it "should not connect to the server until the request", net_connect: true do
|
225
|
-
WebMock.allow_net_connect!
|
226
|
-
@http.start {|conn|
|
227
|
-
expect(conn.peer_cert).to be_nil
|
228
|
-
}
|
229
|
-
end
|
230
|
-
|
231
|
-
it "should connect to the server on start", net_connect: true do
|
232
|
-
WebMock.allow_net_connect!(net_http_connect_on_start: true)
|
233
|
-
@http.start {|conn|
|
234
|
-
cert = OpenSSL::X509::Certificate.new conn.peer_cert
|
235
|
-
expect(cert).to be_a(OpenSSL::X509::Certificate)
|
236
|
-
}
|
237
|
-
end
|
238
|
-
|
239
|
-
end
|
240
|
-
|
241
|
-
describe "when net http is disabled and allowed only for some hosts" do
|
242
|
-
it "should not connect to the server until the request", net_connect: true do
|
243
|
-
WebMock.disable_net_connect!(allow: "www.google.com")
|
244
|
-
@http.start {|conn|
|
245
|
-
expect(conn.peer_cert).to be_nil
|
246
|
-
}
|
247
|
-
end
|
248
|
-
|
249
|
-
it "should connect to the server on start", net_connect: true do
|
250
|
-
WebMock.disable_net_connect!(allow: "www.google.com", net_http_connect_on_start: true)
|
251
|
-
@http.start {|conn|
|
252
|
-
cert = OpenSSL::X509::Certificate.new conn.peer_cert
|
253
|
-
expect(cert).to be_a(OpenSSL::X509::Certificate)
|
254
|
-
}
|
255
|
-
end
|
256
|
-
|
257
|
-
it "should connect to the server if the URI matches an regex", net_connect: true do
|
258
|
-
WebMock.disable_net_connect!(allow: /google.com/)
|
259
|
-
Net::HTTP.get('www.google.com','/')
|
260
|
-
end
|
261
|
-
|
262
|
-
it "should connect to the server if the URI matches any regex the array", net_connect: true do
|
263
|
-
WebMock.disable_net_connect!(allow: [/google.com/, /yahoo.com/])
|
264
|
-
Net::HTTP.get('www.google.com','/')
|
265
|
-
end
|
266
|
-
|
267
|
-
end
|
268
|
-
|
269
|
-
end
|
270
|
-
|
271
|
-
describe "when net_http_connect_on_start is true" do
|
272
|
-
before(:each) do
|
273
|
-
WebMock.allow_net_connect!(net_http_connect_on_start: true)
|
274
|
-
end
|
275
|
-
it_should_behave_like "Net::HTTP"
|
276
|
-
end
|
277
|
-
|
278
|
-
describe "when net_http_connect_on_start is false" do
|
279
|
-
before(:each) do
|
280
|
-
WebMock.allow_net_connect!(net_http_connect_on_start: false)
|
281
|
-
end
|
282
|
-
it_should_behave_like "Net::HTTP"
|
283
|
-
end
|
284
|
-
|
285
|
-
describe 'after_request callback support', net_connect: true do
|
286
|
-
let(:expected_body_regex) { /hello world/ }
|
287
|
-
|
288
|
-
before(:each) do
|
289
|
-
WebMock.allow_net_connect!
|
290
|
-
@callback_invocation_count = 0
|
291
|
-
WebMock.after_request do |_, response|
|
292
|
-
@callback_invocation_count += 1
|
293
|
-
@callback_response = response
|
294
|
-
end
|
295
|
-
end
|
296
|
-
|
297
|
-
after(:each) do
|
298
|
-
WebMock.reset_callbacks
|
299
|
-
end
|
300
|
-
|
301
|
-
def perform_get_with_returning_block
|
302
|
-
http_request(:get, "http://localhost:#{port}/") do |response|
|
303
|
-
return response.body
|
304
|
-
end
|
305
|
-
end
|
306
|
-
|
307
|
-
it "should support the after_request callback on an request with block and read_body" do
|
308
|
-
response_body = ''.dup
|
309
|
-
http_request(:get, "http://localhost:#{port}/") do |response|
|
310
|
-
response.read_body { |fragment| response_body << fragment }
|
311
|
-
end
|
312
|
-
expect(response_body).to match(expected_body_regex)
|
313
|
-
|
314
|
-
expect(@callback_response.body).to eq(response_body)
|
315
|
-
end
|
316
|
-
|
317
|
-
it "should support the after_request callback on a request with a returning block" do
|
318
|
-
response_body = perform_get_with_returning_block
|
319
|
-
expect(response_body).to match(expected_body_regex)
|
320
|
-
expect(@callback_response).to be_instance_of(WebMock::Response)
|
321
|
-
expect(@callback_response.body).to eq(response_body)
|
322
|
-
end
|
323
|
-
|
324
|
-
it "should only invoke the after_request callback once, even for a recursive post request" do
|
325
|
-
Net::HTTP.new('localhost', port).post('/', nil)
|
326
|
-
expect(@callback_invocation_count).to eq(1)
|
327
|
-
end
|
328
|
-
end
|
329
|
-
|
330
|
-
it "should match http headers, even if their values have been set in a request as numbers" do
|
331
|
-
WebMock.disable_net_connect!
|
332
|
-
|
333
|
-
stub_request(:post, "www.example.com").with(headers: {"My-Header" => 99})
|
334
|
-
|
335
|
-
uri = URI.parse('http://www.example.com/')
|
336
|
-
req = Net::HTTP::Post.new(uri.path)
|
337
|
-
req['My-Header'] = 99
|
338
|
-
|
339
|
-
res = Net::HTTP.start(uri.host, uri.port) do |http|
|
340
|
-
http.request(req, '')
|
341
|
-
end
|
342
|
-
end
|
343
|
-
|
344
|
-
describe "hostname handling" do
|
345
|
-
it "should set brackets around the hostname if it is an IPv6 address" do
|
346
|
-
net_http = Net::HTTP.new('b2dc:5bdf:4f0d::3014:e0ca', 80)
|
347
|
-
path = '/example.jpg'
|
348
|
-
expect(WebMock::NetHTTPUtility.get_uri(net_http, path)).to eq('http://[b2dc:5bdf:4f0d::3014:e0ca]:80/example.jpg')
|
349
|
-
end
|
350
|
-
|
351
|
-
it "should not set brackets around the hostname if it is already wrapped by brackets" do
|
352
|
-
net_http = Net::HTTP.new('[b2dc:5bdf:4f0d::3014:e0ca]', 80)
|
353
|
-
path = '/example.jpg'
|
354
|
-
expect(WebMock::NetHTTPUtility.get_uri(net_http, path)).to eq('http://[b2dc:5bdf:4f0d::3014:e0ca]:80/example.jpg')
|
355
|
-
end
|
356
|
-
|
357
|
-
it "should not set brackets around the hostname if it is an IPv4 address" do
|
358
|
-
net_http = Net::HTTP.new('181.152.137.168', 80)
|
359
|
-
path = '/example.jpg'
|
360
|
-
expect(WebMock::NetHTTPUtility.get_uri(net_http, path)).to eq('http://181.152.137.168:80/example.jpg')
|
361
|
-
end
|
362
|
-
|
363
|
-
it "should not set brackets around the hostname if it is a domain" do
|
364
|
-
net_http = Net::HTTP.new('www.example.com', 80)
|
365
|
-
path = '/example.jpg'
|
366
|
-
expect(WebMock::NetHTTPUtility.get_uri(net_http, path)).to eq('http://www.example.com:80/example.jpg')
|
367
|
-
end
|
368
|
-
end
|
369
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
module NetHTTPSpecHelper
|
2
|
-
def http_request(method, uri, options = {}, &block)
|
3
|
-
begin
|
4
|
-
uri = URI.parse(uri)
|
5
|
-
rescue
|
6
|
-
uri = Addressable::URI.heuristic_parse(uri)
|
7
|
-
end
|
8
|
-
response = nil
|
9
|
-
clazz = Net::HTTP.const_get("#{method.to_s.capitalize}")
|
10
|
-
req = clazz.new("#{uri.path}#{uri.query ? '?' : ''}#{uri.query}", nil)
|
11
|
-
options[:headers].each do |k,v|
|
12
|
-
if v.is_a?(Array)
|
13
|
-
v.each_with_index do |e,i|
|
14
|
-
i == 0 ? (req[k] = e) : req.add_field(k, e)
|
15
|
-
end
|
16
|
-
else
|
17
|
-
req[k] = v
|
18
|
-
end
|
19
|
-
end if options[:headers]
|
20
|
-
|
21
|
-
if options[:basic_auth]
|
22
|
-
req.basic_auth(options[:basic_auth][0], options[:basic_auth][1])
|
23
|
-
end
|
24
|
-
|
25
|
-
http = Net::HTTP.new(uri.host, uri.port)
|
26
|
-
if uri.scheme == "https"
|
27
|
-
http.use_ssl = true
|
28
|
-
#1.9.1 has a bug with ssl_timeout
|
29
|
-
http.ssl_timeout = 20 unless RUBY_PLATFORM =~ /java/
|
30
|
-
http.open_timeout = 60
|
31
|
-
http.read_timeout = 60
|
32
|
-
end
|
33
|
-
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
|
34
|
-
response = http.start {|open_http|
|
35
|
-
open_http.request(req, options[:body], &block)
|
36
|
-
}
|
37
|
-
headers = {}
|
38
|
-
response.each_header {|name, value| headers[name] = value}
|
39
|
-
OpenStruct.new({
|
40
|
-
body: response.body,
|
41
|
-
headers: WebMock::Util::Headers.normalize_headers(headers),
|
42
|
-
status: response.code,
|
43
|
-
message: response.message
|
44
|
-
})
|
45
|
-
end
|
46
|
-
|
47
|
-
def client_timeout_exception_class
|
48
|
-
if defined?(Net::OpenTimeout)
|
49
|
-
Net::OpenTimeout
|
50
|
-
elsif defined?(Net::HTTP::OpenTimeout)
|
51
|
-
Net::HTTP::OpenTimeout
|
52
|
-
else
|
53
|
-
Timeout::Error
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
def connection_refused_exception_class
|
58
|
-
Errno::ECONNREFUSED
|
59
|
-
end
|
60
|
-
|
61
|
-
def http_library
|
62
|
-
:net_http
|
63
|
-
end
|
64
|
-
end
|
@@ -1,20 +0,0 @@
|
|
1
|
-
require 'rubygems'
|
2
|
-
require 'rspec'
|
3
|
-
require 'net/http'
|
4
|
-
require 'net/https'
|
5
|
-
require 'stringio'
|
6
|
-
require 'acceptance/net_http/net_http_shared'
|
7
|
-
require 'support/webmock_server'
|
8
|
-
|
9
|
-
describe "Real Net:HTTP without webmock", without_webmock: true do
|
10
|
-
before(:all) do
|
11
|
-
raise "WebMock has no access here!!!" if defined?(WebMock::NetHTTPUtility)
|
12
|
-
WebMockServer.instance.start
|
13
|
-
end
|
14
|
-
|
15
|
-
after(:all) do
|
16
|
-
WebMockServer.instance.stop
|
17
|
-
end
|
18
|
-
|
19
|
-
it_should_behave_like "Net::HTTP"
|
20
|
-
end
|