module HTTPX::Plugins::Proxy::InstanceMethods

def build_altsvc_connection(_, _, _, _, options)

def build_altsvc_connection(_, _, _, _, options)
  return if options.proxy
  super
end

def build_connection(uri, options)

def build_connection(uri, options)
  proxy = options.proxy
  return super unless proxy
  connection = options.connection_class.new("tcp", uri, options)
  pool.init_connection(connection, options)
  connection
end

def fetch_response(request, connections, options)

def fetch_response(request, connections, options)
  response = super
  if response.is_a?(ErrorResponse) &&
     # either it was a timeout error connecting, or it was a proxy error
     PROXY_ERRORS.any? { |ex| response.error.is_a?(ex) } && !@_proxy_uris.empty?
    @_proxy_uris.shift
    log { "failed connecting to proxy, trying next..." }
    request.transition(:idle)
    connection = find_connection(request, connections, options)
    connections << connection unless connections.include?(connection)
    connection.send(request)
    set_request_timeout(connection, request, options)
    return
  end
  response
end

def find_connection(request, connections, options)

def find_connection(request, connections, options)
  return super unless options.respond_to?(:proxy)
  uri = URI(request.uri)
  next_proxy = proxy_uris(uri, options)
  raise Error, "Failed to connect to proxy" unless next_proxy
  proxy_options = options.merge(proxy: Parameters.new(**next_proxy))
  connection = pool.find_connection(uri, proxy_options) || build_connection(uri, proxy_options)
  unless connections.nil? || connections.include?(connection)
    connections << connection
    set_connection_callbacks(connection, options)
  end
  connection
end

def proxy_uris(uri, options)

def proxy_uris(uri, options)
  @_proxy_uris ||= begin
    uris = options.proxy ? Array(options.proxy[:uri]) : []
    if uris.empty?
      uri = URI(uri).find_proxy
      uris << uri if uri
    end
    uris
  end
  options.proxy.merge(uri: @_proxy_uris.first) unless @_proxy_uris.empty?
end

def with_proxy(*args)

def with_proxy(*args)
  branch(default_options.with_proxy(*args))
end