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