'This is one of the most important methods, it will take things from the
discovery Queue and store them in one or more Queues (audit, bruteforce,
etc).
Also keep in mind that is one of the only methods that will be run in
the "main thread" and lives during the whole scan process.'

def _fuzzable_request_router(self):

    _input = [self._seed_producer, self._discovery_consumer, self._bruteforce_consumer]
    _input = filter(None, _input)
    output = [self._audit_consumer, self._discovery_consumer, self._bruteforce_consumer]
    output = filter(None, output)
    _other = [self._audit_consumer, self._auth_consumer, self._grep_consumer]
    _other = filter(None, _other)
    finished = set()
    consumer_forced_end = set()
    while True:
        self._handle_all_consumer_exceptions(_other)
        route_result = self._route_one_fuzzable_request_batch(_input, output, finished, consumer_forced_end)
        if (route_result is None):
            break
        (finished, consumer_forced_end) = route_result
