'Get the execute.xml file and parse it.
:param fuzzable_request: A fuzzable_request instance that contains
(among other things) the URL to test.'

@runonce(exc_class=RunOnce)
def crawl(self, fuzzable_request):

    base_url = fuzzable_request.get_url().base_url()
    for file_name in ('execute.xml', 'DeveloperMenu.xml'):
        genexus_url = base_url.url_join(file_name)
        http_response = self._uri_opener.GET(genexus_url, cache=True)
        if ('</ObjLink>' not in http_response):
            return
        if is_404(http_response):
            return
        desc = 'The    "%s"    file    was    found    at:    "%s",    this    file    might    expose    private    URLs    and    requires    a    manual    review.    The    scanner    will    add    all    URLs    listed    in    this    file    to    the    crawl    queue.'
        desc = (desc % (file_name, genexus_url))
        title_info = ('GeneXus    "%s"    file' % file_name)
        i = Info(title_info, desc, http_response.id, self.get_name())
        i.set_url(genexus_url)
        kb.kb.append(self, file_name, i)
        om.out.information(i.get_desc())
        self.output_queue.put(FuzzableRequest(genexus_url))
        self._parse_xml(http_response, file_name, base_url)
