def request(self, method, path, headers=None, data=None, **kwargs):
        """
        (Primarily) internal method for making all requests to the datacenter.
        
        :param method: HTTP verb
        :type method: :py:class:`str`
        
        :param path: path relative to `login` path
        :type path: :py:class:`str`
        
        :param headers: additional headers to send
        :type headers: :py:class:`dict`
        
        :Returns: tuple of decoded response body & `Response` object
        :raises: client (4xx) errors
        """
        full_path = self.url + path
        request_headers = {}
        request_headers.update(self.default_headers)
        if headers:
            request_headers.update(headers)
        jdata = None
        if data:
            jdata = json.dumps(data)
        if self.verbose:
            print("%s\t%s\t%s" % 
                (datetime.now().isoformat(), method, full_path), 
                file=self.verbose)
        resp = requests.request(method, full_path, auth=self.auth, 
            headers=request_headers, data=jdata,
            verify=self.verify, **kwargs)
        if (resp.status_code == 401 and self.auth and 
                self.auth.signer._agent_key):
            self.auth.signer.swap_keys()
            return self.request(method, path, headers=headers, data=data,
                **kwargs)
        if 400 <= resp.status_code < 499:
            if resp.content:
                print(resp.content, file=sys.stderr)
            resp.raise_for_status()
        if resp.content:
            if resp.headers['content-type'] == 'application/json':
                return (json.loads(resp.content), resp)
            else:
                return (resp.content, resp)
        else:
            return (None, resp)