blob: 13a46ec9652451a253d440604c6bd30801b01373 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2017 Ericsson and others.
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Simon Delisle - Initial API and implementation
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.project.wizards.importtrace;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.util.Collection;
import org.apache.commons.io.FileUtils;
import org.eclipse.tracecompass.internal.tmf.ui.Activator;
import com.google.common.net.MediaType;
/**
* Helper to download traces from HTTP/HTTPS.
*
* @author Simon Delisle
*
*/
public class DownloadTraceHttpHelper {
private static final String CONTENT_DISPOSITION = "Content-Disposition"; //$NON-NLS-1$
private DownloadTraceHttpHelper() {
// Do nothing, private constructor
}
/**
* Download trace from a HTTP/HTTPS source.
*
* @param traceUrl
* Trace url you want to download
* @param destinationDir
* Directory where the trace will be saved
* @return The downloaded trace or null if something went wrong
*/
public static TraceDownloadStatus downloadTrace(String traceUrl, String destinationDir) {
File destFile = null;
try {
URL url = new URL(traceUrl);
HttpURLConnection httpConnection = (HttpURLConnection) url.openConnection();
httpConnection.setConnectTimeout(120000); // 2 minutes timeout
int responseCode = httpConnection.getResponseCode();
if (responseCode != HttpURLConnection.HTTP_OK) {
httpConnection.disconnect();
return new TraceDownloadStatus(TraceDownloadStatus.ERROR, destFile, null);
}
String fileName = getFileName(httpConnection);
destFile = new File(destinationDir, fileName);
try {
FileUtils.copyURLToFile(url, destFile);
} catch (IOException e) {
Activator.getDefault().logError("Unable to download from " + url.toString() + " to " + destFile.toString()); //$NON-NLS-1$ //$NON-NLS-2$
cleanDirectory(new File(destinationDir));
return new TraceDownloadStatus(TraceDownloadStatus.ERROR, destFile, e);
} finally {
httpConnection.disconnect();
}
} catch (SocketTimeoutException e) {
return new TraceDownloadStatus(TraceDownloadStatus.TIMEOUT, null, e);
} catch (IOException e) {
return new TraceDownloadStatus(TraceDownloadStatus.ERROR, null, e);
}
return new TraceDownloadStatus(TraceDownloadStatus.OK, destFile, null);
}
/**
* Download multiple traces from a list of HTTP/HTTPS sources.
*
* @param tracesUrl
* Collection of trace url
* @param destinationDir
* Directory where the traces will be saved
* @return List that contains downloaded traces or null if something went
* wrong
*/
public static TraceDownloadStatus downloadTraces(Collection<String> tracesUrl, String destinationDir) {
TraceDownloadStatus status = new TraceDownloadStatus(TraceDownloadStatus.OK, null, null);
for (String traceUrl : tracesUrl) {
TraceDownloadStatus singleFileStatus = downloadTrace(traceUrl, destinationDir);
status.add(singleFileStatus);
}
return status;
}
/**
* Try to find the name of the file by using connection information.
*
* @param connection
* HTTP connection
* @return File name
*/
private static String getFileName(HttpURLConnection connection) {
String fileName = getLastSegmentUrl(connection.getURL().toString());
String contentType = connection.getContentType();
if (contentType != null) {
MediaType type = MediaType.parse(contentType);
if (type.is(MediaType.ANY_APPLICATION_TYPE)) {
String contentDisposition = connection.getHeaderField(CONTENT_DISPOSITION);
if (contentDisposition != null) {
String[] content = contentDisposition.split(";"); //$NON-NLS-1$
for (String string : content) {
if (string.contains("filename=")) { //$NON-NLS-1$
int index = string.indexOf('"');
fileName = string.substring(index + 1, string.length() - 1);
}
}
}
}
}
return fileName;
}
/**
* Get the last part of a specific url (after the last '/').
*
* @param url
* The url
* @return The last segment of the url
*/
private static String getLastSegmentUrl(String url) {
int indexFile = url.lastIndexOf('/');
return url.substring(indexFile + 1, url.length());
}
/**
* Clean the destination directory in case something went wrong during the
* download.
*
* @param dir
* Directory to delete
*/
private static void cleanDirectory(File dir) {
try {
FileUtils.deleteDirectory(dir);
} catch (IOException e) {
Activator.getDefault().logError("Unable to delete: " + dir.toString(), e); //$NON-NLS-1$
}
}
}