package com.microsoft.bingads.internal.utilities; import com.microsoft.bingads.AsyncCallback; import com.microsoft.bingads.CouldNotDownloadResultFileException; import com.microsoft.bingads.CouldNotUploadFileException; import com.microsoft.bingads.internal.ResultFuture; import com.microsoft.bingads.internal.functionalinterfaces.Consumer; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.ProxySelector; import java.net.URI; import java.net.URISyntaxException; import java.util.concurrent.Future; import org.apache.http.HttpRequest; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.impl.conn.ProxySelectorRoutePlanner; import org.apache.http.params.HttpConnectionParams; import org.apache.http.params.HttpParams; public class HttpClientHttpFileService implements HttpFileService { @Override public void downloadFile(String url, File tempZipFile, boolean overwrite, int timeoutInMilliseconds) throws IOException, URISyntaxException { if (!overwrite && tempZipFile.exists()) { throw new IOException(String.format("Could not download result file due to file %s already exists", tempZipFile)); } DefaultHttpClient client = null; try { client = createHttpClientWithProxy(); HttpParams params = client.getParams(); HttpConnectionParams.setConnectionTimeout(params, timeoutInMilliseconds); HttpConnectionParams.setSoTimeout(params, timeoutInMilliseconds); HttpGet httpget = new HttpGet(new URI(url)); HttpResponse response = client.execute(httpget); InputStream content = response.getEntity().getContent(); FileOutputStream tempFileOutput = null; try { tempFileOutput = new FileOutputStream(tempZipFile); FileUtils.copy(content, tempFileOutput); } finally { if (tempFileOutput != null) { tempFileOutput.close(); } } } catch (IOException ex) { throw new CouldNotDownloadResultFileException(ex); } catch (IllegalStateException ex) { throw new CouldNotDownloadResultFileException(ex); } finally { if (client != null) { client.getConnectionManager().shutdown(); } } } @Override public void uploadFile(URI uri, File uploadFilePath, Consumer<HttpRequest> addHeaders, int timeoutInMilliseconds) { FileInputStream stream = null; try { stream = new FileInputStream(uploadFilePath); DefaultHttpClient client = null; try { client = createHttpClientWithProxy(); HttpParams params = client.getParams(); HttpConnectionParams.setConnectionTimeout(params, timeoutInMilliseconds); HttpConnectionParams.setSoTimeout(params, timeoutInMilliseconds); HttpPost post = new HttpPost(uri); addHeaders.accept(post); MultipartEntity e = new MultipartEntity(); e.addPart("file", new FileBody(uploadFilePath, "application/octet-stream")); post.setEntity(e); HttpResponse response = client.execute(post); if (response.getStatusLine().getStatusCode() != 200) { InputStream in = response.getEntity().getContent(); BufferedReader streamReader = new BufferedReader(new InputStreamReader(in, "UTF-8")); StringBuilder exceptionMessage = new StringBuilder(); String inputStr; while ((inputStr = streamReader.readLine()) != null) { exceptionMessage.append(inputStr); } throw new CouldNotUploadFileException("Unsuccessful Status Code: " + response.getStatusLine().getStatusCode() + "; Exception Message: " + exceptionMessage); } } catch (ClientProtocolException e) { throw new CouldNotUploadFileException(e); } catch (IOException e) { throw new CouldNotUploadFileException(e); } catch (IllegalStateException e) { throw new CouldNotUploadFileException(e); } finally { if (client != null) { client.getConnectionManager().shutdown(); } } } catch (FileNotFoundException e) { throw new CouldNotUploadFileException(e); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { throw new CouldNotUploadFileException(e); } } } } @Override public Future<File> downloadFileAsync(String url, File tempZipFile, AsyncCallback<File> callback, int timeoutInMilliseconds) { final ResultFuture<File> resultFuture = new ResultFuture<File>(callback); DefaultHttpClient client = null; try { client = createHttpClientWithProxy(); HttpParams params = client.getParams(); HttpConnectionParams.setConnectionTimeout(params, timeoutInMilliseconds); HttpConnectionParams.setSoTimeout(params, timeoutInMilliseconds); HttpGet httpget = new HttpGet(new URI(url)); HttpResponse response = client.execute(httpget); InputStream content = response.getEntity().getContent(); FileOutputStream tempFileOutput = null; try { tempFileOutput = new FileOutputStream(tempZipFile); FileUtils.copy(content, tempFileOutput); resultFuture.setResult(tempZipFile); } finally { if (tempFileOutput != null) { tempFileOutput.close(); } } } catch (URISyntaxException ex) { resultFuture.setException(ex); } catch (IOException ex) { resultFuture.setException(new CouldNotDownloadResultFileException(ex)); } catch (IllegalStateException ex) { resultFuture.setException(new CouldNotDownloadResultFileException(ex)); } finally { if (client != null) { client.getConnectionManager().shutdown(); } } return resultFuture; } private DefaultHttpClient createHttpClientWithProxy() { DefaultHttpClient client = new DefaultHttpClient(); ProxySelector proxySelector = ProxySelector.getDefault(); client.setRoutePlanner(new ProxySelectorRoutePlanner(client.getConnectionManager().getSchemeRegistry(), proxySelector)); return client; } }