class Async::HTTP::WebMockClientWrapper
def build_request_headers(request)
they carry nothing to match against. Keys are downcased so the same
hash from the raw fields instead, skipping entries with no value since
(since protocol-http 0.56.0) and raises when a value is nil. Build the
Protocol::HTTP::Headers#to_h parses values through the header policies
def build_request_headers(request) request.headers.each.each_with_object({}) do |(key, value), headers| next if value.nil? (headers[key.downcase] ||= []) << value end end
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: build_request_headers(request), 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, WebMock::HttpLibAdapters::AsyncHttpClientAdapter.status_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