':param name_id: Identifier of the Subject (a NameID instance)
:param entity_ids: List of entity ids for the IdPs that have provided
information concerning the subject
:param reason: The reason for doing the logout
:param expire: Try to logout before this time.
:param sign: Whether to sign the request or not
:param expected_binding: Specify the expected binding then not try it
all
:return:'

def do_logout(self, name_id, entity_ids, reason, expire, sign=None, expected_binding=None):

    if (not not_on_or_after(expire)):
        self.local_logout(name_id)
        return (0, '504    Gateway    Timeout', [], [])
    not_done = entity_ids[:]
    responses = {}
    for entity_id in entity_ids:
        logger.debug(("Logout    from    '%s'" % entity_id))
        for binding in [BINDING_SOAP, BINDING_HTTP_POST, BINDING_HTTP_REDIRECT]:
            if (expected_binding and (binding != expected_binding)):
                continue
            try:
                srvs = self.metadata.single_logout_service(entity_id, binding, 'idpsso')
            except:
                srvs = None
            if (not srvs):
                logger.debug(("No    SLO    '%s'    service" % binding))
                continue
            destination = destinations(srvs)[0]
            logger.info(('destination    to    provider:    %s' % destination))
            (req_id, request) = self.create_logout_request(destination, entity_id, name_id=name_id, reason=reason, expire=expire)
            if binding.startswith('http://'):
                sign = True
            if (sign is None):
                sign = self.logout_requests_signed
            if sign:
                srequest = self.sign(request)
            else:
                srequest = ('%s' % request)
            relay_state = self._relay_state(req_id)
            http_info = self.apply_binding(binding, srequest, destination, relay_state)
            if (binding == BINDING_SOAP):
                response = self.send(**http_info)
                if (response and (response.status_code == 200)):
                    not_done.remove(entity_id)
                    response = response.text
                    logger.info(('Response:    %s' % response))
                    res = self.parse_logout_request_response(response, binding)
                    responses[entity_id] = res
                else:
                    logger.info(('NOT    OK    response    from    %s' % destination))
            else:
                self.state[req_id] = {'entity_id': entity_id, 'operation': 'SLO', 'entity_ids': entity_ids, 'name_id': code(name_id), 'reason': reason, 'not_on_of_after': expire, 'sign': sign}
                responses[entity_id] = (binding, http_info)
                not_done.remove(entity_id)
            break
    if not_done:
        raise LogoutError(('%s' % (entity_ids,)))
    return responses
