'Perform an HTTP request against the server.
method: the HTTP method to use
url: the URL to request (not including server portion)
headers: headers for the request
body: body to send with the request
ignore_result_body: the body of the result will be ignored
Returns: a http_client response object'

def _http_request(self, method, url, headers, body, ignore_result_body=False):

    if self.auth_token:
        headers.setdefault('x-auth-token', self.auth_token)
    LOG.debug('Request:    %(method)s    http://%(server)s:%(port)s%(url)s    with    headers    %(headers)s', {'method': method, 'server': self.conn.host, 'port': self.conn.port, 'url': url, 'headers': repr(headers)})
    self.conn.request(method, url, body, headers)
    response = self.conn.getresponse()
    headers = self._header_list_to_dict(response.getheaders())
    code = response.status
    code_description = http.responses[code]
    LOG.debug('Response:    %(code)s    %(status)s    %(headers)s', {'code': code, 'status': code_description, 'headers': repr(headers)})
    if (code == http.BAD_REQUEST):
        raise exc.HTTPBadRequest(explanation=response.read())
    if (code == http.INTERNAL_SERVER_ERROR):
        raise exc.HTTPInternalServerError(explanation=response.read())
    if (code == http.UNAUTHORIZED):
        raise exc.HTTPUnauthorized(explanation=response.read())
    if (code == http.FORBIDDEN):
        raise exc.HTTPForbidden(explanation=response.read())
    if (code == http.CONFLICT):
        raise exc.HTTPConflict(explanation=response.read())
    if ignore_result_body:
        response.read()
    return response
