package com.epam.wilma.test.client;
/*==========================================================================
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 java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.zip.GZIPOutputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.methods.InputStreamRequestEntity;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.xml.sax.SAXException;
import com.sun.xml.fastinfoset.sax.SAXDocumentSerializer;
/**
* Sends a new HTTP request to a server through a proxy.
* @author Marton_Sereg
*
*/
public class HttpRequestSender {
private final Logger logger = LoggerFactory.getLogger(HttpRequestSender.class);
/**
* Sends a new HTTP request to a server through a proxy.
* @param requestParameters a set of parameters that will set the content of the request
* and specify the proxy it should go through
*/
public void callWilmaTestServer(final RequestParameters requestParameters, final TestClientParameters clientParameters) {
try {
HttpClient httpClient = new HttpClient();
String serverUrl = requestParameters.getTestServerUrl();
logger.info("Server URL: " + serverUrl);
PostMethod httpPost = new PostMethod(serverUrl);
if (clientParameters.isUseProxy()) {
String proxyHost = requestParameters.getWilmaHost();
Integer proxyPort = requestParameters.getWilmaPort();
logger.info("Proxy: " + proxyHost + ":" + proxyPort);
httpClient.getHostConfiguration().setProxy(proxyHost, proxyPort);
}
InputStream inputStream = requestParameters.getInputStream();
if (requestParameters.getContentType().contains("fastinfoset")) {
logger.info("Compressing it by using FIS.");
inputStream = compress(inputStream);
}
if (requestParameters.getContentEncoding().contains("gzip")) {
logger.info("Encoding it by using gzip.");
inputStream = encode(inputStream);
httpPost.setRequestHeader("Content-Encoding", requestParameters.getContentEncoding());
}
InputStreamRequestEntity entity = new InputStreamRequestEntity(inputStream, requestParameters.getContentType());
httpPost.setRequestEntity(entity);
String acceptHeader = requestParameters.getAcceptHeader();
logger.info("Accept (header): " + acceptHeader);
httpPost.setRequestHeader("Accept", acceptHeader);
String acceptEncoding = requestParameters.getAcceptEncoding();
logger.info("Accept-Encoding: " + acceptEncoding);
httpPost.addRequestHeader("Accept-Encoding", acceptEncoding);
logger.info("Add 'AlterMessage' header.");
httpPost.addRequestHeader("AlterMessage", "true"); //always request alter message from Wilma
//httpPost.addRequestHeader("0", "WilmaBypass=true");
httpClient.getHttpConnectionManager().getParams().setSendBufferSize(clientParameters.getRequestBufferSize());
httpClient.getHttpConnectionManager().getParams().setReceiveBufferSize(clientParameters.getResponseBufferSize());
int statusCode = httpClient.executeMethod(httpPost);
logger.info("Response Status Code: " + statusCode);
if (clientParameters.getAllowResponseLogging()) {
logger.info(getInputStreamAsString(httpPost.getResponseBodyAsStream()));
}
} catch (UnsupportedEncodingException e) {
throw new SystemException("Unsupported encoding.", e);
} catch (HttpException e) {
throw new SystemException("Http exception occurred.", e);
} catch (IOException e) {
throw new SystemException("InputStream cannot be read.", e);
}
}
private InputStream encode(final InputStream inputStream) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(baos);
//... Code to read from your original uncompressed data and write to gout.
IOUtils.copy(inputStream, gout);
gout.finish();
//Convert to InputStream.
return new ByteArrayInputStream(baos.toByteArray());
}
private String getInputStreamAsString(final InputStream inputStream) throws IOException {
return IOUtils.toString(inputStream);
}
private InputStream compress(final InputStream source) {
try {
OutputStream fis = new ByteArrayOutputStream();
SAXDocumentSerializer saxDocumentSerializer = new SAXDocumentSerializer();
saxDocumentSerializer.setOutputStream(fis);
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
saxParserFactory.setNamespaceAware(true);
SAXParser saxParser = saxParserFactory.newSAXParser();
saxParser.parse(source, saxDocumentSerializer);
return new ByteArrayInputStream(((ByteArrayOutputStream) fis).toByteArray());
} catch (ParserConfigurationException e) {
throw new SystemException("error", e);
} catch (SAXException e) {
throw new SystemException("error", e);
} catch (IOException e) {
throw new SystemException("error", e);
}
}
}