forked from bblimke/webmock
/
excon_adapter.rb
95 lines (78 loc) · 2.95 KB
/
excon_adapter.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
begin
require 'excon'
rescue LoadError
# excon not found
end
if defined?(Excon)
WebMock::VersionChecker.new('Excon', Excon::VERSION, '0.9.6').check_version!
module WebMock
module HttpLibAdapters
class ExconAdapter < HttpLibAdapter
adapter_for :excon
def self.enable!
Excon.send(:remove_const, :Connection)
Excon.send(:const_set, :Connection, ExconConnection)
end
def self.disable!
Excon.send(:remove_const, :Connection)
Excon.send(:const_set, :Connection, ExconConnection.superclass)
end
def self.to_query(hash)
string = ""
for key, values in hash
if values.nil?
string << key.to_s << '&'
else
for value in [*values]
string << key.to_s << '=' << CGI.escape(value.to_s) << '&'
end
end
end
string.chop! # remove trailing '&'
end
def self.build_request(params)
params = params.dup
method = (params.delete(:method) || :get).to_s.downcase.to_sym
params[:query] = to_query(params[:query]) if params[:query].is_a?(Hash)
uri = Addressable::URI.new(params).to_s
WebMock::RequestSignature.new method, uri, :body => params[:body], :headers => params[:headers]
end
def self.real_response(mock)
raise Excon::Errors::Timeout if mock.should_timeout
mock.raise_error_if_any
Excon::Response.new \
:body => mock.body,
:status => mock.status[0].to_i,
:headers => mock.headers
end
def self.mock_response(real)
mock = WebMock::Response.new
mock.status = real.status
mock.headers = real.headers
mock.body = real.body
mock
end
def self.perform_callbacks(request, response, options = {})
return unless WebMock::CallbackRegistry.any_callbacks?
WebMock::CallbackRegistry.invoke_callbacks(options.merge(:lib => :excon), request, response)
end
end
class ExconConnection < ::Excon::Connection
def request_kernel(params, &block)
mock_request = ExconAdapter.build_request params.dup
WebMock::RequestRegistry.instance.requested_signatures.put(mock_request)
if mock_response = WebMock::StubRegistry.instance.response_for_request(mock_request)
ExconAdapter.perform_callbacks(mock_request, mock_response, :real_request => false)
ExconAdapter.real_response(mock_response)
elsif WebMock.net_connect_allowed?(mock_request.uri)
real_response = super
ExconAdapter.perform_callbacks(mock_request, ExconAdapter.mock_response(real_response), :real_request => true)
real_response
else
raise WebMock::NetConnectNotAllowedError.new(mock_request)
end
end
end
end
end
end