'Iterates over the given node iterator, sending an HTTP request to one
node at a time.  The first non-informational, non-server-error
response is returned.  If no non-informational, non-server-error
response is received from any of the nodes, returns None.
:param nodes: an iterator of the backend server and handoff servers
:param part: the partition number
:param method: the method to send to the backend
:param path: the path to send to the backend
(full path ends up being /<$device>/<$part>/<$path>)
:param headers: dictionary of headers
:param query: query string to send to the backend.
:param logger_thread_locals: The thread local values to be set on the
self.app.logger to retain transaction
logging information.
:returns: a swob.Response object, or None if no responses were received'

def _make_request(self, nodes, part, method, path, headers, query, logger_thread_locals):

    self.app.logger.thread_locals = logger_thread_locals
    for node in nodes:
        try:
            start_node_timing = time.time()
            with ConnectionTimeout(self.app.conn_timeout):
                conn = http_connect(node['ip'], node['port'], node['device'], part, method, path, headers=headers, query_string=query)
                conn.node = node
            self.app.set_node_timing(node, (time.time() - start_node_timing))
            with Timeout(self.app.node_timeout):
                resp = conn.getresponse()
                if ((not is_informational(resp.status)) and (not is_server_error(resp.status))):
                    return (resp.status, resp.reason, resp.getheaders(), resp.read())
                elif (resp.status == HTTP_INSUFFICIENT_STORAGE):
                    self.app.error_limit(node, _('ERROR    Insufficient    Storage'))
                elif is_server_error(resp.status):
                    self.app.error_occurred(node, (_('ERROR    %(status)d    Trying    to    %(method)s    %(path)s    From    %(type)s    Server') % {'status': resp.status, 'method': method, 'path': path, 'type': self.server_type}))
        except (Exception, Timeout):
            self.app.exception_occurred(node, self.server_type, (_('Trying    to    %(method)s    %(path)s') % {'method': method, 'path': path}))
