'Make an API request'

def _api_request(self, method, url, **kwargs):

    allow_404 = kwargs.pop('allow_404', False)
    headers = kwargs.setdefault('headers', {})
    headers.setdefault('Authorization', ('token    %s' % self.api_token))
    try:
        r = requests.request(method, url, **kwargs)
    except requests.ConnectionError:
        msg = ('Failed    to    connect    to    Hub    API    at    %r.' % self.api_url)
        msg += ('        Is    the    Hub    accessible    at    this    URL    (from    host:    %s)?' % socket.gethostname())
        if ('127.0.0.1' in self.api_url):
            msg += ('        Make    sure    to    set    c.JupyterHub.hub_ip    to    an    IP    accessible    to' + '    single-user    servers    if    the    servers    are    not    on    the    same    host    as    the    Hub.')
        raise HTTPError(500, msg)
    data = None
    if ((r.status_code == 404) and allow_404):
        pass
    elif (r.status_code == 403):
        app_log.error("I    don't    have    permission    to    check    authorization    with    JupyterHub,    my    auth    token    may    have    expired:    [%i]    %s", r.status_code, r.reason)
        app_log.error(r.text)
        raise HTTPError(500, 'Permission    failure    checking    authorization,    I    may    need    a    new    token')
    elif (r.status_code >= 500):
        app_log.error('Upstream    failure    verifying    auth    token:    [%i]    %s', r.status_code, r.reason)
        app_log.error(r.text)
        raise HTTPError(502, 'Failed    to    check    authorization    (upstream    problem)')
    elif (r.status_code >= 400):
        app_log.warning('Failed    to    check    authorization:    [%i]    %s', r.status_code, r.reason)
        app_log.warning(r.text)
        raise HTTPError(500, 'Failed    to    check    authorization')
    else:
        data = r.json()
    return data
