/*
* SoapUI, Copyright (C) 2004-2016 SmartBear Software
*
* Licensed under the EUPL, Version 1.1 or - as soon as they will be approved by the European Commission - subsequent
* versions of the EUPL (the "Licence");
* You may not use this work except in compliance with the Licence.
* You may obtain a copy of the Licence at:
*
* http://ec.europa.eu/idabc/eupl
*
* Unless required by applicable law or agreed to in writing, software distributed under the Licence is
* distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied. See the Licence for the specific language governing permissions and limitations
* under the Licence.
*/
package com.eviware.soapui.impl.wsdl.support;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpResponse;
import org.apache.http.HttpVersion;
import org.apache.http.client.protocol.ResponseContentEncoding;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.message.BasicHttpResponse;
import org.apache.http.message.BasicStatusLine;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.DeflaterOutputStream;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;
import java.util.zip.InflaterInputStream;
public class CompressionSupport {
public static final String ALG_GZIP = "gzip";
public static final String ALG_DEFLATE = "deflate";
private static final String[] algs = {ALG_GZIP, ALG_DEFLATE};
public static String getAvailableAlgorithms(String separator) {
StringBuilder buf = new StringBuilder();
for (int i = 0; i < algs.length; ++i) {
if (i > 0) {
buf.append(separator);
}
buf.append(algs[i]);
}
return buf.toString();
}
public static String getAvailableAlgorithm(String httpContentEncoding) {
for (String alg : algs) {
if (httpContentEncoding.toLowerCase().endsWith(alg)) {
return alg;
}
}
return null;
}
private static void checkAlg(String alg) throws Exception {
if (!ALG_GZIP.equals(alg) && !ALG_DEFLATE.equals(alg)) {
throw new Exception("Compression algorithm not supported: " + alg);
}
}
public static byte[] compress(String alg, byte[] content) throws Exception {
checkAlg(alg);
if (ALG_GZIP.equals(alg)) {
return GZIPCompress(content);
} else if (ALG_DEFLATE.equals(alg)) {
return DeflaterCompress(content);
} else {
return null;
}
}
public static byte[] decompress(String alg, byte[] content) throws Exception {
// Use the excellent content encoding handling that exists in HTTP Client
HttpResponse response = new BasicHttpResponse(new BasicStatusLine(new HttpVersion(1, 0), 0, null));
ByteArrayEntity entity = new ByteArrayEntity(content);
entity.setContentEncoding(alg);
response.setEntity(entity);
new ResponseContentEncoding().process(response, null);
return IOUtils.toByteArray(response.getEntity().getContent());
}
// createCompressionInputStream can be used in the future if
// PipedInputStreams are used
// for sending compressed data instead of creating compressed byte array
// first and then sending
public static InputStream createCompressionInputStream(String alg, byte[] content) throws Exception {
checkAlg(alg);
ByteArrayInputStream bais = new ByteArrayInputStream(content);
if (ALG_GZIP.equals(alg)) {
return new GZIPInputStream(bais);
} else if (ALG_DEFLATE.equals(alg)) {
return new InflaterInputStream(bais);
} else {
return null;
}
}
private static byte[] GZIPCompress(byte[] requestContent) throws IOException {
ByteArrayOutputStream compressedContent = new ByteArrayOutputStream();
GZIPOutputStream gzipstream = new GZIPOutputStream(compressedContent);
gzipstream.write(requestContent);
gzipstream.finish();
// get the compressed content
return compressedContent.toByteArray();
}
private static byte[] DeflaterCompress(byte[] requestContent) throws IOException {
ByteArrayOutputStream compressedContent = new ByteArrayOutputStream();
DeflaterOutputStream defstream = new DeflaterOutputStream(compressedContent);
defstream.write(requestContent);
defstream.finish();
// get the compressed content
return compressedContent.toByteArray();
}
}