'Make a request using the next server according to the connection
strategy, and retries up to max_retries attempts. Ultimately,
if the request still failed, we reraise the HTTPError from
urllib3. If at the start of the request, there are no known
available hosts, we revive all dead connections and forcefully
attempt to reconnect.'

def urlopen(self, method, path, headers=None, **kwargs):

    kwargs.setdefault('assert_same_host', False)
    last_error = None
    try:
        for _ in range((self.max_retries + 1)):
            if (len(self.connections) == 0):
                self.force_revive()
            conn = self.strategy.next(self.connections)
            if (headers is not None):
                headers = dict(conn.headers, **headers)
            try:
                return conn.urlopen(method, path, headers=headers, **kwargs)
            except HTTPError:
                self.mark_dead(conn)
                last_error = sys.exc_info()
        if (last_error is not None):
            six.reraise(*last_error)
    finally:
        self.cleanup_dead()
