private static URL scanNodes()

in src/protocol/http/src/main/java/org/apache/jmeter/protocol/http/parser/JTidyHTMLParser.java [78:199]


    private static URL scanNodes(Node node, URLCollection urls, URL baseUrl) throws HTMLParseException {
        if (node == null) {
            return baseUrl;
        }

        String name = node.getNodeName();

        int type = node.getNodeType();

        switch (type) {

        case Node.DOCUMENT_NODE:
            scanNodes(((Document) node).getDocumentElement(), urls, baseUrl);
            break;

        case Node.ELEMENT_NODE:

            NamedNodeMap attrs = node.getAttributes();
            if (name.equalsIgnoreCase(TAG_BASE)) {
                String tmp = getValue(attrs, ATT_HREF);
                if (tmp != null) {
                    try {
                        baseUrl = ConversionUtils.makeRelativeURL(baseUrl, tmp);
                    } catch (MalformedURLException e) {
                        throw new HTMLParseException(e);
                    }
                }
                break;
            }

            if (name.equalsIgnoreCase(TAG_IMAGE) || name.equalsIgnoreCase(TAG_EMBED)) {
                urls.addURL(getValue(attrs, ATT_SRC), baseUrl);
                break;
            }

            if (name.equalsIgnoreCase(TAG_APPLET)) {
                String codebase = getValue(attrs, ATT_CODEBASE);
                String code = getValue(attrs, ATT_ARCHIVE);
                if (StringUtils.isBlank(code)) {
                    code = getValue(attrs, ATT_CODE);
                }
                if (StringUtils.isBlank(codebase)) {
                    urls.addURL(code, baseUrl);
                } else {
                    urls.addURL(codebase + "/" + code, baseUrl);
                }
                break;
            }

            if (name.equalsIgnoreCase(TAG_OBJECT)) {
                String data = getValue(attrs, "codebase");
                if(!StringUtils.isEmpty(data)) {
                    urls.addURL(data, baseUrl);
                }

                data = getValue(attrs, "data");
                if(!StringUtils.isEmpty(data)) {
                    urls.addURL(data, baseUrl);
                }
                break;
            }

            if (name.equalsIgnoreCase(TAG_INPUT)) {
                String src = getValue(attrs, ATT_SRC);
                String typ = getValue(attrs, ATT_TYPE);
                if ((src != null) && ATT_IS_IMAGE.equalsIgnoreCase(typ)) {
                    urls.addURL(src, baseUrl);
                }
                break;
            }
            if (TAG_LINK.equalsIgnoreCase(name) &&
                    (STYLESHEET.equalsIgnoreCase(getValue(attrs, ATT_REL))
                            || SHORTCUT_ICON.equalsIgnoreCase(getValue(attrs, ATT_REL))
                            || ICON.equalsIgnoreCase(getValue(attrs, ATT_REL))
                            || PRELOAD.equalsIgnoreCase(getValue(attrs, ATT_REL)))) {
                urls.addURL(getValue(attrs, ATT_HREF), baseUrl);
                break;
            }
            if (name.equalsIgnoreCase(TAG_SCRIPT)) {
                urls.addURL(getValue(attrs, ATT_SRC), baseUrl);
                break;
            }
            if (name.equalsIgnoreCase(TAG_FRAME)) {
                urls.addURL(getValue(attrs, ATT_SRC), baseUrl);
                break;
            }
            if (name.equalsIgnoreCase(TAG_IFRAME)) {
                urls.addURL(getValue(attrs, ATT_SRC), baseUrl);
                break;
            }
            String back = getValue(attrs, ATT_BACKGROUND);
            if (back != null) {
                urls.addURL(back, baseUrl);
            }
            if (name.equalsIgnoreCase(TAG_BGSOUND)) {
                urls.addURL(getValue(attrs, ATT_SRC), baseUrl);
                break;
            }

            String style = getValue(attrs, ATT_STYLE);
            if (style != null) {
                HtmlParsingUtils.extractStyleURLs(baseUrl, urls, style);
            }

            NodeList children = node.getChildNodes();
            if (children != null) {
                int len = children.getLength();
                for (int i = 0; i < len; i++) {
                    baseUrl = scanNodes(children.item(i), urls, baseUrl);
                }
            }

            break;

        default:
            // ignored
            break;
        }

        return baseUrl;

    }