org.eclipse.che.plugin.urlfactory.URLFetcher.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.che.plugin.urlfactory.URLFetcher.java

Source

/*******************************************************************************
 * Copyright (c) 2012-2017 Codenvy, S.A.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *   Codenvy, S.A. - initial API and implementation
 *******************************************************************************/
package org.eclipse.che.plugin.urlfactory;

import org.apache.commons.compress.utils.BoundedInputStream;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.inject.Singleton;
import javax.validation.constraints.NotNull;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.stream.Collectors;

import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.Objects.requireNonNull;

/**
 * Allow to grab content from URL
 *
 * @author Florent Benoit
 */
@Singleton
public class URLFetcher {

    /**
     * Logger.
     */
    private static final Logger LOG = LoggerFactory.getLogger(URLFetcher.class);

    /**
     * Maximum size of allowed data. (30KB)
     */
    protected static final long MAXIMUM_READ_BYTES = 30 * 1000;

    /**
     * Fetch the url provided and return its content
     * To prevent DOS attack, limit the amount of the collected data
     *
     * @param url
     *         the URL to fetch
     * @return the content of the file
     */
    public String fetch(@NotNull final String url) {
        requireNonNull(url, "url parameter can't be null");
        try {
            return fetch(new URL(url).openConnection());
        } catch (IOException e) {
            // we shouldn't fetch if check is done before
            LOG.debug("Invalid URL", e);
            return null;
        }
    }

    /**
     * Fetch the urlConnection stream by using the urlconnection and return its content
     * To prevent DOS attack, limit the amount of the collected data
     *
     * @param urlConnection
     *         the URL connection to fetch
     * @return the content of the file
     */
    public String fetch(@NotNull URLConnection urlConnection) {
        requireNonNull(urlConnection, "urlConnection parameter can't be null");
        final String value;
        try (InputStream inputStream = urlConnection.getInputStream();
                BufferedReader reader = new BufferedReader(
                        new InputStreamReader(new BoundedInputStream(inputStream, getLimit()), UTF_8))) {
            value = reader.lines().collect(Collectors.joining("\n"));
        } catch (IOException e) {
            // we shouldn't fetch if check is done before
            LOG.debug("Invalid URL", e);
            return null;
        }
        return value;
    }

    /**
     * Maximum size that can be read.
     * @return maximum size.
     */
    protected long getLimit() {
        return MAXIMUM_READ_BYTES;
    }
}