class Async::HTTP::WebMockClientWrapper
def build_request_signature(request)
def build_request_signature(request) body = request.read request.body = ::Protocol::HTTP::Body::Buffered.wrap(body) WebMock::RequestSignature.new( request.method.downcase.to_sym, "#{request.scheme}://#{request.authority}#{request.path}", headers: request.headers.to_h, body: body ) end
def build_webmock_response(response)
def build_webmock_response(response) body = response.read response.body = ::Protocol::HTTP::Body::Buffered.wrap(body) webmock_response = WebMock::Response.new webmock_response.status = [ response.status, ::Protocol::HTTP1::Reason::DESCRIPTIONS[response.status] ] webmock_response.headers = build_webmock_response_headers(response) webmock_response.body = body webmock_response end
def build_webmock_response_headers(response)
def build_webmock_response_headers(response) response.headers.each.each_with_object({}) do |(k, v), o| o[k] ||= [] o[k] << v end end
def call(request)
def call(request) request.scheme ||= self.scheme request.authority ||= self.authority request_signature = build_request_signature(request) WebMock::RequestRegistry.instance.requested_signatures.put(request_signature) webmock_response = WebMock::StubRegistry.instance.response_for_request(request_signature) net_connect_allowed = WebMock.net_connect_allowed?(request_signature.uri) real_request = false if webmock_response webmock_response.raise_error_if_any raise Async::TimeoutError, 'WebMock timeout error' if webmock_response.should_timeout WebMockApplication.add_webmock_response(request, webmock_response) response = @webmock_client.call(request) elsif net_connect_allowed response = @network_client.call(request) real_request = true else raise WebMock::NetConnectNotAllowedError.new(request_signature) unless webmock_response end if WebMock::CallbackRegistry.any_callbacks? webmock_response ||= build_webmock_response(response) WebMock::CallbackRegistry.invoke_callbacks( { lib: :async_http_client, real_request: real_request }, request_signature, webmock_response ) end response end
def close
def close @network_client.close @webmock_client.close end
def initialize(
def initialize( endpoint, protocol: endpoint.protocol, scheme: endpoint.scheme, authority: endpoint.authority, **options ) webmock_endpoint = WebMockEndpoint.new(scheme, authority, protocol) @network_client = WebMockClient.new(endpoint, **options) @webmock_client = WebMockClient.new(webmock_endpoint, **options) @endpoint = endpoint @scheme = scheme @authority = authority end