'Since threadpool\'s apply_async runs the callback only when the call to
this method ends without any exceptions, it is *very important* to
handle exceptions correctly here. Failure to do so will end up in
_task_done not called, which will make has_pending_work always return
True.
Python 3 has an error_callback in the apply_async method, which we could
use in the future.
:param fuzzable_request: The fuzzable request that (if suitable) will be
bruteforced by @plugin.
:return: A list of the URL\'s that have been successfully bruteforced'

@task_decorator
def _bruteforce(self, function_id, plugin, fuzzable_request):

    res = set()
    om.out.debug(('Called    _bruteforce(%s,%s)' % (plugin.get_name(), fuzzable_request)))
    self._w3af_core.status.set_running_plugin('bruteforce', plugin.get_name())
    self._w3af_core.status.set_current_fuzzable_request('bruteforce', fuzzable_request)
    try:
        new_frs = plugin.bruteforce_wrapper(fuzzable_request)
    except Exception as e:
        self.handle_exception('bruteforce', plugin.get_name(), fuzzable_request, e)
    else:
        res.update(new_frs)
    return res
