/* * Copyright 2016 ANI Technologies Pvt. Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.olacabs.fabric.compute.builder.impl; import com.google.common.base.Strings; import org.apache.http.Header; import org.apache.http.HeaderElement; import org.apache.http.HttpStatus; import org.apache.http.NameValuePair; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.FileAttribute; import java.nio.file.attribute.PosixFilePermission; import java.nio.file.attribute.PosixFilePermissions; import java.util.Set; /** * TODO javadoc. */ public class HttpJarDownloader implements JarDownloader{ private static final Logger LOGGER = LoggerFactory.getLogger(HttpJarDownloader.class); private final String tmpDirectory; private final CloseableHttpClient httpClient; public HttpJarDownloader() throws Exception { FileAttribute<Set<PosixFilePermission>> perms = PosixFilePermissions.asFileAttribute(PosixFilePermissions.fromString("rwxr-xr-x")); Path createdPath = Files.createTempDirectory(null, perms); this.tmpDirectory = createdPath.toAbsolutePath().toString(); PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); cm.setMaxTotal(20); httpClient = HttpClients.custom().setConnectionManager(cm).build(); } public Path download(final String url) { HttpGet httpGet = new HttpGet(URI.create(url)); CloseableHttpResponse response = null; try { response = httpClient.execute(httpGet); if (HttpStatus.SC_OK != response.getStatusLine().getStatusCode()) { throw new RuntimeException( String.format("Server returned [%d][%s] for url: %s", response.getStatusLine().getStatusCode(), response.getStatusLine().getReasonPhrase(), url)); } Header[] headers = response.getHeaders("Content-Disposition"); String filename = null; if (null != headers) { for (Header header : headers) { for (HeaderElement headerElement : header.getElements()) { if (!headerElement.getName().equalsIgnoreCase("attachment")) { continue; } NameValuePair attachment = headerElement.getParameterByName("filename"); if (attachment != null) { filename = attachment.getValue(); } } } } if (Strings.isNullOrEmpty(filename)) { String[] nameParts = url.split("/"); filename = nameParts[nameParts.length - 1]; } return Files.write(Paths.get(this.tmpDirectory, filename), EntityUtils.toByteArray(response.getEntity())); } catch (IOException e) { throw new RuntimeException("Error loading class from: " + url, e); } finally { if (null != response) { try { response.close(); } catch (IOException e) { LOGGER.error("Could not close connection to server: ", e); } } } } }