# File lib/webmock/http_lib_adapters/httpclient_adapter.rb, line 133
  def build_request_signature(req, reuse_existing = false)
    uri = WebMock::Util::URI.heuristic_parse(req.header.request_uri.to_s)
    uri.query = WebMock::Util::QueryMapper.values_to_query(req.header.request_query, :notation => WebMock::Config.instance.query_values_notation) if req.header.request_query
    uri.port = req.header.request_uri.port
    uri = uri.omit(:userinfo)

    auth = www_auth.basic_auth
    auth.challenge(req.header.request_uri, nil)

    @request_filter.each do |filter|
      filter.filter_request(req)
    end

    headers = req.header.all.inject({}) do |hdrs, header|
      hdrs[header[0]] ||= []
      hdrs[header[0]] << header[1]
      hdrs
    end
    headers = headers_from_session(uri).merge(headers)

    if (auth_cred = auth.get(req)) && auth.scheme == 'Basic'
      userinfo = WebMock::Util::Headers.decode_userinfo_from_header(auth_cred)
      userinfo = WebMock::Util::URI.encode_unsafe_chars_in_userinfo(userinfo)
      headers.reject! {|k,v| k =~ /[Aa]uthorization/ && v =~ /^Basic / } #we added it to url userinfo
      uri.userinfo = userinfo
    end

    signature = WebMock::RequestSignature.new(
      req.header.request_method.downcase.to_sym,
      uri.to_s,
      :body => req.http_body.dump,
      :headers => headers
    )

    # reuse a previous identical signature object if we stored one for later use
    if reuse_existing && previous_signature = previous_signature_for(signature)
      return previous_signature
    end

    signature
  end