def request(self, method, path, headers={}, data=None): auth_headers = sign_request(key=self.key, http_method=method, path=self.parsed_url.path + path.split('?', 1)[0], body=data, host=self.parsed_url.netloc, timestamp=datetime.datetime.utcnow(), user_id=self.client) request_headers = {} request_headers.update(self.headers) request_headers.update(dict( (k.lower(), v) for k, v in headers.items())) request_headers['x-chef-version'] = self.version request_headers.update(auth_headers) try: response = self._request( method, self.url + path, data, dict((k.capitalize(), v) for k, v in request_headers.items())) except requests.ConnectionError as e: raise ChefServerError(str(e)) except requests.Timeout as e: raise ChefServerError(e) if not response.ok: raise ChefServerError.from_error(response.reason, code=response.status_code) return response