class Async::HTTP::WebMockClientWrapper

def build_request_headers(request)

header sent in different casings is grouped together.
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