package com.epam.wilma.service.http;
/*==========================================================================
Copyright 2013-2017 EPAM Systems
This file is part of Wilma.
Wilma is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Wilma is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Wilma. If not, see <http://www.gnu.org/licenses/>.
===========================================================================*/
import com.google.common.base.Optional;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpMethodBase;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* An HTTP "user-agent" for Wilma server, containing more request methods.
*
* @author Tamas_Pinter
*
*/
public class WilmaHttpClient {
private static final Logger LOG = LoggerFactory.getLogger(WilmaHttpClient.class);
private HttpClient httpclient = new HttpClient();
/**
* Calls the given URL via HTTP GET method and returns {@code String}
* {@code Optional} of the response.
*
* @param url the given URL
* @return an {@code Optional} instance containing the HTTP method's
* response; otherwise returns {@link Optional#absent}.
*/
public Optional<String> sendGetterRequest(final String url) {
String response = null;
GetMethod method = new GetMethod(url);
try {
int statusCode = httpclient.executeMethod(method);
if (HttpStatus.SC_OK == statusCode) {
InputStream inputResponse = method.getResponseBodyAsStream();
response = IOUtils.toString(inputResponse, "UTF-8");
}
} catch (HttpException e) {
LOG.error("Protocol exception occurred when called: " + url, e);
} catch (IOException e) {
LOG.error("I/O (transport) error occurred when called: " + url, e);
} finally {
method.releaseConnection();
}
return Optional.fromNullable(response);
}
/**
* Calls the given URL via HTTP GET method and returns {@code true} if the
* request was successful.
*
* @param url the given URL
* @return {@code true} if the request is successful, otherwise return {@code false}
*/
public boolean sendSetterRequest(final String url) {
boolean requestSuccessful;
GetMethod method = new GetMethod(url);
requestSuccessful = executeCall(method, url);
method.releaseConnection();
return requestSuccessful;
}
private boolean executeCall(final HttpMethodBase methodBase, final String url) {
boolean requestSuccessful = false;
try {
int statusCode = httpclient.executeMethod(methodBase);
if (HttpStatus.SC_OK == statusCode) {
requestSuccessful = true;
}
} catch (HttpException e) {
LOG.error("Protocol exception occurred when called: " + url, e);
} catch (IOException e) {
LOG.error("I/O (transport) error occurred when called: " + url, e);
}
return requestSuccessful;
}
/**
* Posting the given file to the given URL via HTTP POST method and returns
* {@code true} if the request was successful.
*
* @param url the given URL
* @param file the given file
* @return {@code true} if the request is successful, otherwise return {@code false}
*/
public boolean uploadFile(String url, File file) {
boolean requestSuccessful = false;
PostMethod method = new PostMethod(url);
try {
Part[] parts = {new FilePart("file", file)};
method.setRequestEntity(new MultipartRequestEntity(parts, method.getParams()));
int statusCode = httpclient.executeMethod(method);
if (HttpStatus.SC_OK == statusCode) {
requestSuccessful = true;
}
} catch (HttpException e) {
LOG.error("Protocol exception occurred when called: " + url, e);
} catch (IOException e) {
LOG.error("I/O (transport) error occurred when called: " + url, e);
} finally {
method.releaseConnection();
}
return requestSuccessful;
}
/**
* Posting the given stream to the given URL via HTTP POST method and returns
* {@code true} if the request was successful.
*
* @param url the given URL
* @param resource the given string that will be uploaded as resource
* @return {@code true} if the request is successful, otherwise return {@code false}
*/
public boolean uploadString(String url, String resource) {
boolean requestSuccessful = false;
PostMethod method = new PostMethod(url);
try {
method.setRequestEntity(new StringRequestEntity(resource, null, null));
int statusCode = httpclient.executeMethod(method);
if (HttpStatus.SC_OK == statusCode) {
requestSuccessful = true;
}
} catch (HttpException e) {
LOG.error("Protocol exception occurred when called: " + url, e);
} catch (IOException e) {
LOG.error("I/O (transport) error occurred when called: " + url, e);
} finally {
method.releaseConnection();
}
return requestSuccessful;
}
public void setHttpClient(HttpClient httpclient) {
this.httpclient = httpclient;
}
}