Search in sources :

Example 1 with LinkExtractorParser

use of org.apache.jmeter.protocol.http.parser.LinkExtractorParser in project jmeter by apache.

the class HTTPSamplerBase method downloadPageResources.

/**
     * Download the resources of an HTML page.
     *
     * @param pRes
     *            result of the initial request - must contain an HTML response
     * @param container
     *            for storing the results, if any
     * @param frameDepth
     *            Depth of this target in the frame structure. Used only to
     *            prevent infinite recursion.
     * @return res if no resources exist, otherwise the "Container" result with one subsample per request issued
     */
protected HTTPSampleResult downloadPageResources(final HTTPSampleResult pRes, final HTTPSampleResult container, final int frameDepth) {
    HTTPSampleResult res = pRes;
    Iterator<URL> urls = null;
    try {
        final byte[] responseData = res.getResponseData();
        if (responseData.length > 0) {
            // Bug 39205
            final LinkExtractorParser parser = getParser(res);
            if (parser != null) {
                String userAgent = getUserAgent(res);
                urls = parser.getEmbeddedResourceURLs(userAgent, responseData, res.getURL(), res.getDataEncodingWithDefault());
            }
        }
    } catch (LinkExtractorParseException e) {
        // Don't break the world just because this failed:
        res.addSubResult(errorResult(e, new HTTPSampleResult(res)));
        setParentSampleSuccess(res, false);
    }
    HTTPSampleResult lContainer = container;
    // Iterate through the URLs and download each image:
    if (urls != null && urls.hasNext()) {
        if (lContainer == null) {
            lContainer = new HTTPSampleResult(res);
            lContainer.addRawSubResult(res);
        }
        res = lContainer;
        // Get the URL matcher
        String re = getEmbeddedUrlRE();
        Perl5Matcher localMatcher = null;
        Pattern pattern = null;
        if (re.length() > 0) {
            try {
                pattern = JMeterUtils.getPattern(re);
                // don't fetch unless pattern compiles
                localMatcher = JMeterUtils.getMatcher();
            } catch (MalformedCachePatternException e) {
                // NOSONAR
                log.warn("Ignoring embedded URL match string: " + e.getMessage());
            }
        }
        // For concurrent get resources
        final List<Callable<AsynSamplerResultHolder>> list = new ArrayList<>();
        // init with default value
        int maxConcurrentDownloads = CONCURRENT_POOL_SIZE;
        boolean isConcurrentDwn = isConcurrentDwn();
        if (isConcurrentDwn) {
            try {
                maxConcurrentDownloads = Integer.parseInt(getConcurrentPool());
            } catch (NumberFormatException nfe) {
                log.warn(// $NON-NLS-1$
                "Concurrent download resources selected, " + // $NON-NLS-1$
                "but pool size value is bad. Use default value");
            }
            // no need to use another thread, do the sample on the current thread
            if (maxConcurrentDownloads == 1) {
                log.warn("Number of parallel downloads set to 1, (sampler name=" + getName() + ")");
                isConcurrentDwn = false;
            }
        }
        while (urls.hasNext()) {
            // See catch clause below
            Object binURL = urls.next();
            try {
                URL url = (URL) binURL;
                if (url == null) {
                    log.warn("Null URL detected (should not happen)");
                } else {
                    try {
                        url = escapeIllegalURLCharacters(url);
                    } catch (Exception e) {
                        // NOSONAR
                        res.addSubResult(errorResult(new Exception(url.toString() + " is not a correct URI", e), new HTTPSampleResult(res)));
                        setParentSampleSuccess(res, false);
                        continue;
                    }
                    // I don't think localMatcher can be null here, but check just in case
                    if (pattern != null && localMatcher != null && !localMatcher.matches(url.toString(), pattern)) {
                        // we have a pattern and the URL does not match, so skip it
                        continue;
                    }
                    try {
                        url = url.toURI().normalize().toURL();
                    } catch (MalformedURLException | URISyntaxException e) {
                        res.addSubResult(errorResult(new Exception(url.toString() + " URI can not be normalized", e), new HTTPSampleResult(res)));
                        setParentSampleSuccess(res, false);
                        continue;
                    }
                    if (isConcurrentDwn) {
                        // if concurrent download emb. resources, add to a list for async gets later
                        list.add(new ASyncSample(url, HTTPConstants.GET, false, frameDepth + 1, getCookieManager(), this));
                    } else {
                        // default: serial download embedded resources
                        HTTPSampleResult binRes = sample(url, HTTPConstants.GET, false, frameDepth + 1);
                        res.addSubResult(binRes);
                        setParentSampleSuccess(res, res.isSuccessful() && (binRes == null || binRes.isSuccessful()));
                    }
                }
            } catch (ClassCastException e) {
                // NOSONAR
                res.addSubResult(errorResult(new Exception(binURL + " is not a correct URI", e), new HTTPSampleResult(res)));
                setParentSampleSuccess(res, false);
            }
        }
        // IF for download concurrent embedded resources
        if (isConcurrentDwn && !list.isEmpty()) {
            ResourcesDownloader resourcesDownloader = ResourcesDownloader.getInstance();
            try {
                // sample all resources
                final List<Future<AsynSamplerResultHolder>> retExec = resourcesDownloader.invokeAllAndAwaitTermination(maxConcurrentDownloads, list);
                CookieManager cookieManager = getCookieManager();
                // add result to main sampleResult
                for (Future<AsynSamplerResultHolder> future : retExec) {
                    // this call will not block as the futures return by invokeAllAndAwaitTermination
                    //   are either done or cancelled
                    AsynSamplerResultHolder binRes = future.get();
                    if (cookieManager != null) {
                        CollectionProperty cookies = binRes.getCookies();
                        for (JMeterProperty jMeterProperty : cookies) {
                            Cookie cookie = (Cookie) jMeterProperty.getObjectValue();
                            cookieManager.add(cookie);
                        }
                    }
                    res.addSubResult(binRes.getResult());
                    setParentSampleSuccess(res, res.isSuccessful() && (binRes.getResult() != null ? binRes.getResult().isSuccessful() : true));
                }
            } catch (InterruptedException ie) {
                // $NON-NLS-1$
                log.warn("Interrupted fetching embedded resources", ie);
                Thread.currentThread().interrupt();
            } catch (ExecutionException ee) {
                // $NON-NLS-1$
                log.warn("Execution issue when fetching embedded resources", ee);
            }
        }
    }
    return res;
}
Also used : MalformedURLException(java.net.MalformedURLException) JMeterProperty(org.apache.jmeter.testelement.property.JMeterProperty) ArrayList(java.util.ArrayList) Perl5Matcher(org.apache.oro.text.regex.Perl5Matcher) URISyntaxException(java.net.URISyntaxException) URL(java.net.URL) Callable(java.util.concurrent.Callable) LinkExtractorParser(org.apache.jmeter.protocol.http.parser.LinkExtractorParser) ExecutionException(java.util.concurrent.ExecutionException) AsynSamplerResultHolder(org.apache.jmeter.protocol.http.sampler.ResourcesDownloader.AsynSamplerResultHolder) LinkExtractorParseException(org.apache.jmeter.protocol.http.parser.LinkExtractorParseException) CookieManager(org.apache.jmeter.protocol.http.control.CookieManager) Cookie(org.apache.jmeter.protocol.http.control.Cookie) Pattern(org.apache.oro.text.regex.Pattern) CollectionProperty(org.apache.jmeter.testelement.property.CollectionProperty) MalformedCachePatternException(org.apache.oro.text.MalformedCachePatternException) URISyntaxException(java.net.URISyntaxException) NoSuchAlgorithmException(java.security.NoSuchAlgorithmException) UnsupportedEncodingException(java.io.UnsupportedEncodingException) MalformedCachePatternException(org.apache.oro.text.MalformedCachePatternException) MalformedURLException(java.net.MalformedURLException) LinkExtractorParseException(org.apache.jmeter.protocol.http.parser.LinkExtractorParseException) IOException(java.io.IOException) ExecutionException(java.util.concurrent.ExecutionException) Future(java.util.concurrent.Future)

Aggregations

IOException (java.io.IOException)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 MalformedURLException (java.net.MalformedURLException)1 URISyntaxException (java.net.URISyntaxException)1 URL (java.net.URL)1 NoSuchAlgorithmException (java.security.NoSuchAlgorithmException)1 ArrayList (java.util.ArrayList)1 Callable (java.util.concurrent.Callable)1 ExecutionException (java.util.concurrent.ExecutionException)1 Future (java.util.concurrent.Future)1 Cookie (org.apache.jmeter.protocol.http.control.Cookie)1 CookieManager (org.apache.jmeter.protocol.http.control.CookieManager)1 LinkExtractorParseException (org.apache.jmeter.protocol.http.parser.LinkExtractorParseException)1 LinkExtractorParser (org.apache.jmeter.protocol.http.parser.LinkExtractorParser)1 AsynSamplerResultHolder (org.apache.jmeter.protocol.http.sampler.ResourcesDownloader.AsynSamplerResultHolder)1 CollectionProperty (org.apache.jmeter.testelement.property.CollectionProperty)1 JMeterProperty (org.apache.jmeter.testelement.property.JMeterProperty)1 MalformedCachePatternException (org.apache.oro.text.MalformedCachePatternException)1 Pattern (org.apache.oro.text.regex.Pattern)1 Perl5Matcher (org.apache.oro.text.regex.Perl5Matcher)1