summaryrefslogtreecommitdiff
path: root/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java
diff options
context:
space:
mode:
Diffstat (limited to 'bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java')
-rw-r--r--bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java340
1 files changed, 120 insertions, 220 deletions
diff --git a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java
index 93e5bb1c..1ce6d2cc 100644
--- a/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java
+++ b/bkucommon/src/main/java/at/gv/egiz/bku/binding/DataUrlConnectionImpl.java
@@ -26,29 +26,27 @@ import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
-import java.security.cert.X509Certificate;
+import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
+import javax.net.ssl.SSLPeerUnverifiedException;
import javax.net.ssl.SSLSocketFactory;
import javax.xml.transform.stream.StreamResult;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.StringPart;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import at.gv.egiz.bku.binding.multipart.InputStreamPartSource;
import at.gv.egiz.bku.binding.multipart.SLResultPart;
-import at.gv.egiz.bku.conf.Configurator;
import at.gv.egiz.bku.slcommands.SLResult;
import at.gv.egiz.bku.slcommands.SLResult.SLResultType;
import at.gv.egiz.bku.slexceptions.SLRuntimeException;
@@ -62,168 +60,144 @@ import at.gv.egiz.bku.utils.binding.Protocol;
* systems.
*
*/
-public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
+public class DataUrlConnectionImpl extends HttpsDataURLConnection {
- private final static Log log = LogFactory.getLog(DataUrlConnectionImpl.class);
-
- public static final byte[] B_DEFAULT_RESPONSETYPE = DEFAULT_RESPONSETYPE.getBytes(Charset.forName("UTF-8"));
+ private final Logger log = LoggerFactory.getLogger(DataUrlConnectionImpl.class);
+
+ public static final byte[] B_DEFAULT_RESPONSETYPE = DEFAULT_RESPONSETYPE
+ .getBytes(Charset.forName("UTF-8"));
/**
- * Supported protocols are HTTP and HTTPS.
+ * Supported protocols are HTTP and HTTPS.
*/
public final static Protocol[] SUPPORTED_PROTOCOLS = { Protocol.HTTP,
Protocol.HTTPS };
/**
- * The X509 certificate of the DataURL server.
- */
- protected X509Certificate serverCertificate;
-
- /**
- * The protocol of the DataURL.
- */
- protected Protocol protocol;
-
- /**
- * Use <code>application/x-www-form-urlencoded</code> instead of
- * standard conform <code>application/x-www-form-urlencoded</code>.
+ * Use <code>application/x-www-form-urlencoded</code> instead of standard
+ * conform <code>application/x-www-form-urlencoded</code>.
*/
protected boolean urlEncoded = true;
-
- /**
- * The value of the DataURL.
- */
- protected URL url;
-
+
/**
* The URLConnection used for communication with the DataURL server.
*/
private HttpURLConnection connection;
-
- /**
- * The HTTP request headers.
- */
- protected Map<String, String> requestHttpHeaders;
-
+
/**
* The HTTP form parameters.
*/
- protected ArrayList<HTTPFormParameter> httpFormParameter;
-
+ protected List<HTTPFormParameter> httpFormParameter = new ArrayList<HTTPFormParameter>();
+
/**
* The boundary for multipart/form-data requests.
*/
protected String boundary;
-
- /**
- * The configuration properties.
- */
- protected Properties config = null;
-
- /**
- * The SSLSocketFactory for HTTPS connections.
- */
- protected SSLSocketFactory sslSocketFactory;
-
- /**
- * The HostnameVerifier for HTTPS connections.
- */
- protected HostnameVerifier hostnameVerifier;
/**
* The response of the DataURL server.
*/
- protected DataUrlResponse result;
+ protected DataUrlResponse response;
- /* (non-Javadoc)
- * @see at.gv.egiz.bku.binding.DataUrlConnection#getProtocol()
+ /**
+ * Constructs a new instance of this DataUrlConnection implementation.
+ *
+ * @param url the URL
+ *
+ * @throws IOException if an I/O exception occurs
*/
- public String getProtocol() {
+ public DataUrlConnectionImpl(URL url) throws IOException {
+ super(url);
+
+ Protocol protocol = null;
+ for (int i = 0; i < SUPPORTED_PROTOCOLS.length; i++) {
+ if (SUPPORTED_PROTOCOLS[i].toString().equalsIgnoreCase(url.getProtocol())) {
+ protocol = SUPPORTED_PROTOCOLS[i];
+ break;
+ }
+ }
if (protocol == null) {
- return null;
+ throw new SLRuntimeException("Protocol " + url.getProtocol()
+ + " not supported for data url.");
}
- return protocol.toString();
+ connection = (HttpURLConnection) url.openConnection();
+ connection.setInstanceFollowRedirects(false);
+
+ connection.setDoOutput(true);
+
+
+ boundary = "--" + IdFactory.getInstance().createId().toString();
}
- /* (non-Javadoc)
+ @Override
+ public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
+ if (connection instanceof HttpsURLConnection) {
+ ((HttpsURLConnection) connection).setHostnameVerifier(hostnameVerifier);
+ }
+ }
+
+ @Override
+ public void setSSLSocketFactory(SSLSocketFactory socketFactory) {
+ if (connection instanceof HttpsURLConnection) {
+ ((HttpsURLConnection) connection).setSSLSocketFactory(socketFactory);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
* @see at.gv.egiz.bku.binding.DataUrlConnection#connect()
*/
public void connect() throws SocketTimeoutException, IOException {
- connection = (HttpURLConnection) url.openConnection();
- if (connection instanceof HttpsURLConnection) {
- log.trace("Detected ssl connection");
- HttpsURLConnection https = (HttpsURLConnection) connection;
- if (sslSocketFactory != null) {
- log.debug("Setting custom ssl socket factory for ssl connection");
- https.setSSLSocketFactory(sslSocketFactory);
- } else {
- log.trace("No custom socket factory set");
- }
- if (hostnameVerifier != null) {
- log.debug("Setting custom hostname verifier");
- https.setHostnameVerifier(hostnameVerifier);
- }
- } else {
- log.trace("No secure connection with: " + url + " class="
- + connection.getClass());
- }
- connection.setDoOutput(true);
// Transfer-Encoding: chunked is problematic ...
// e.g. https://issues.apache.org/bugzilla/show_bug.cgi?id=37794
// ... therefore disabled.
// connection.setChunkedStreamingMode(5*1024);
if (urlEncoded) {
- log.debug("Setting DataURL Content-Type to "
- + HttpUtil.APPLICATION_URL_ENCODED);
+ log.debug("Setting DataURL Content-Type to {}.",
+ HttpUtil.APPLICATION_URL_ENCODED);
connection.addRequestProperty(HttpUtil.HTTP_HEADER_CONTENT_TYPE,
HttpUtil.APPLICATION_URL_ENCODED);
} else {
- log.debug("Setting DataURL Content-Type to "
- + HttpUtil.MULTIPART_FOTMDATA_BOUNDARY);
+ log.debug("Setting DataURL Content-Type to {}.",
+ HttpUtil.MULTIPART_FOTMDATA_BOUNDARY);
connection.addRequestProperty(HttpUtil.HTTP_HEADER_CONTENT_TYPE,
HttpUtil.MULTIPART_FOTMDATA + HttpUtil.SEPERATOR[0]
+ HttpUtil.MULTIPART_FOTMDATA_BOUNDARY + "=" + boundary);
}
- Set<String> headers = requestHttpHeaders.keySet();
- Iterator<String> headerIt = headers.iterator();
- while (headerIt.hasNext()) {
- String name = headerIt.next();
- connection.setRequestProperty(name, requestHttpHeaders.get(name));
- }
- log.trace("Connecting to: " + url);
+ log.trace("Connecting to URL '{}'.", url);
connection.connect();
- if (connection instanceof HttpsURLConnection) {
- HttpsURLConnection ssl = (HttpsURLConnection) connection;
- X509Certificate[] certs = (X509Certificate[]) ssl.getServerCertificates();
- if ((certs != null) && (certs.length >= 1)) {
- log.trace("Server certificate: " + certs[0]);
- serverCertificate = certs[0];
- }
- }
}
/* (non-Javadoc)
- * @see at.gv.egiz.bku.binding.DataUrlConnection#getServerCertificate()
+ * @see at.gv.egiz.bku.binding.HttpsDataURLConnection#getServerCertificates()
*/
- public X509Certificate getServerCertificate() {
- return serverCertificate;
+ @Override
+ public Certificate[] getServerCertificates()
+ throws SSLPeerUnverifiedException, IllegalStateException {
+ if (connection instanceof HttpsURLConnection) {
+ return ((HttpsURLConnection) connection).getServerCertificates();
+ } else {
+ return null;
+ }
}
/* (non-Javadoc)
- * @see at.gv.egiz.bku.binding.DataUrlConnection#setHTTPHeader(java.lang.String, java.lang.String)
+ * @see at.gv.egiz.bku.binding.HttpDataURLConnection#setHTTPHeader(java.lang.String, java.lang.String)
*/
+ @Override
public void setHTTPHeader(String name, String value) {
- if (name != null && value != null) {
- requestHttpHeaders.put(name, value);
- }
+ connection.setRequestProperty(name, value);
}
/* (non-Javadoc)
- * @see at.gv.egiz.bku.binding.DataUrlConnection#setHTTPFormParameter(java.lang.String, java.io.InputStream, java.lang.String, java.lang.String, java.lang.String)
+ * @see at.gv.egiz.bku.binding.HttpDataURLConnection#setHTTPFormParameter(java.lang.String, java.io.InputStream, java.lang.String, java.lang.String, java.lang.String)
*/
+ @Override
public void setHTTPFormParameter(String name, InputStream data,
String contentType, String charSet, String transferEncoding) {
- // if a content type is specified we have to switch to multipart/formdata encoding
+ // if a content type is specified we have to switch to multipart/form-data
+ // encoding
if (contentType != null && contentType.length() > 0) {
urlEncoded = false;
}
@@ -231,27 +205,27 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
charSet, transferEncoding));
}
-
-
/* (non-Javadoc)
* @see at.gv.egiz.bku.binding.DataUrlConnection#transmit(at.gv.egiz.bku.slcommands.SLResult)
*/
+ @Override
public void transmit(SLResult slResult) throws IOException {
- log.trace("Sending data");
+ log.trace("Sending data.");
if (urlEncoded) {
//
// application/x-www-form-urlencoded (legacy, SL < 1.2)
//
-
+
OutputStream os = connection.getOutputStream();
- OutputStreamWriter streamWriter = new OutputStreamWriter(os, HttpUtil.DEFAULT_CHARSET);
+ OutputStreamWriter streamWriter = new OutputStreamWriter(os,
+ HttpUtil.DEFAULT_CHARSET);
// ResponseType
streamWriter.write(FORMPARAM_RESPONSETYPE);
streamWriter.write("=");
streamWriter.write(URLEncoder.encode(DEFAULT_RESPONSETYPE, "UTF-8"));
streamWriter.write("&");
-
+
// XMLResponse / Binary Response
if (slResult.getResultType() == SLResultType.XML) {
streamWriter.write(DataUrlConnection.FORMPARAM_XMLRESPONSE);
@@ -271,17 +245,18 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
streamWriter.write("&");
streamWriter.write(URLEncoder.encode(formParameter.getName(), "UTF-8"));
streamWriter.write("=");
- InputStreamReader reader = new InputStreamReader(formParameter.getData(),
- (formParameter.getCharSet() != null)
- ? formParameter.getCharSet()
- : "UTF-8"); // assume request was application/x-www-form-urlencoded, formParam therefore UTF-8
+ InputStreamReader reader = new InputStreamReader(formParameter
+ .getData(), (formParameter.getCharSet() != null) ? formParameter
+ .getCharSet() : "UTF-8"); // assume request was
+ // application/x-www-form-urlencoded,
+ // formParam therefore UTF-8
while ((len = reader.read(cbuf)) != -1) {
urlEnc.write(cbuf, 0, len);
}
urlEnc.flush();
}
streamWriter.close();
-
+
} else {
//
// multipart/form-data (conforming to SL 1.2)
@@ -294,7 +269,7 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
DEFAULT_RESPONSETYPE, "UTF-8");
responseType.setTransferEncoding(null);
parts.add(responseType);
-
+
// XMLResponse / Binary Response
SLResultPart slResultPart = new SLResultPart(slResult,
XML_RESPONSE_ENCODING);
@@ -307,7 +282,7 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
slResultPart.setContentType(slResult.getMimeType());
}
parts.add(slResultPart);
-
+
// transfer parameters
for (HTTPFormParameter formParameter : httpFormParameter) {
InputStreamPartSource source = new InputStreamPartSource(null,
@@ -319,20 +294,21 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
OutputStream os = connection.getOutputStream();
- Part.sendParts(os, parts.toArray(new Part[parts.size()]), boundary.getBytes());
+ Part.sendParts(os, parts.toArray(new Part[parts.size()]), boundary
+ .getBytes());
os.close();
-
+
}
-
+
// MultipartRequestEntity PostMethod
InputStream is = null;
try {
is = connection.getInputStream();
} catch (IOException iox) {
- log.info(iox);
+ log.info("Failed to get InputStream of HTTPUrlConnection.", iox);
}
- log.trace("Reading response");
- result = new DataUrlResponse(url.toString(), connection.getResponseCode(),
+ log.trace("Reading response.");
+ response = new DataUrlResponse(url.toString(), connection.getResponseCode(),
is);
Map<String, String> responseHttpHeaders = new HashMap<String, String>();
Map<String, List<String>> httpHeaders = connection.getHeaderFields();
@@ -349,105 +325,26 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
responseHttpHeaders.put(key, valString);
}
}
- result.setResponseHttpHeaders(responseHttpHeaders);
+ response.setResponseHttpHeaders(responseHttpHeaders);
}
@Override
public DataUrlResponse getResponse() throws IOException {
- return result;
- }
-
- /**
- * inits protocol, url, httpHeaders, formParams
- *
- * @param url
- * must not be null
- */
- @Override
- public void init(URL url) {
-
- for (int i = 0; i < SUPPORTED_PROTOCOLS.length; i++) {
- if (SUPPORTED_PROTOCOLS[i].toString().equalsIgnoreCase(url.getProtocol())) {
- protocol = SUPPORTED_PROTOCOLS[i];
- break;
- }
- }
- if (protocol == null) {
- throw new SLRuntimeException("Protocol " + url.getProtocol()
- + " not supported for data url");
- }
- this.url = url;
- boundary = "--" + IdFactory.getInstance().createId().toString();
- requestHttpHeaders = new HashMap<String, String>();
-
- if (config != null) {
- String version = config.getProperty(Configurator.SIGNATURE_LAYOUT);
- if ((version != null) && (!"".equals(version.trim()))) {
- log.debug("setting SignatureLayout header to " + version);
- requestHttpHeaders.put(Configurator.SIGNATURE_LAYOUT, version);
- } else {
- log.debug("do not set SignatureLayout header");
- }
- String userAgent = config.getProperty(Configurator.USERAGENT_CONFIG_P, Configurator.USERAGENT_DEFAULT);
- requestHttpHeaders.put(HttpUtil.HTTP_HEADER_USER_AGENT, userAgent);
- } else {
- requestHttpHeaders
- .put(HttpUtil.HTTP_HEADER_USER_AGENT, Configurator.USERAGENT_DEFAULT);
-
- }
-
- httpFormParameter = new ArrayList<HTTPFormParameter>();
-
- }
-
- @Override
- public DataUrlConnectionSPI newInstance() {
- DataUrlConnectionSPI uc = new DataUrlConnectionImpl();
- uc.setConfiguration(config);
- uc.setSSLSocketFactory(sslSocketFactory);
- uc.setHostnameVerifier(hostnameVerifier);
- return uc;
+ return response;
}
- @Override
- public URL getUrl() {
- return url;
- }
-
- @Override
- public void setConfiguration(Properties config) {
- this.config = config;
- }
-
- @Override
- public void setSSLSocketFactory(SSLSocketFactory socketFactory) {
- this.sslSocketFactory = socketFactory;
- }
-
- @Override
- public void setHostnameVerifier(HostnameVerifier hostnameVerifier) {
- this.hostnameVerifier = hostnameVerifier;
- }
-
public class HTTPFormParameter {
- private String name;
-
+ private String name;
+
private InputStream data;
-
+
private String contentType;
-
+
private String charSet;
-
+
private String transferEncoding;
-
- /**
- * @param name
- * @param data
- * @param contentType
- * @param charSet
- * @param transferEncoding
- */
+
public HTTPFormParameter(String name, InputStream data, String contentType,
String charSet, String transferEncoding) {
super();
@@ -466,7 +363,8 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
/**
- * @param name the name to set
+ * @param name
+ * the name to set
*/
public void setName(String name) {
this.name = name;
@@ -480,7 +378,8 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
/**
- * @param data the data to set
+ * @param data
+ * the data to set
*/
public void setData(InputStream data) {
this.data = data;
@@ -494,7 +393,8 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
/**
- * @param contentType the contentType to set
+ * @param contentType
+ * the contentType to set
*/
public void setContentType(String contentType) {
this.contentType = contentType;
@@ -508,7 +408,8 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
/**
- * @param charSet the charSet to set
+ * @param charSet
+ * the charSet to set
*/
public void setCharSet(String charSet) {
this.charSet = charSet;
@@ -522,13 +423,12 @@ public class DataUrlConnectionImpl implements DataUrlConnectionSPI {
}
/**
- * @param transferEncoding the transferEncoding to set
+ * @param transferEncoding
+ * the transferEncoding to set
*/
public void setTransferEncoding(String transferEncoding) {
this.transferEncoding = transferEncoding;
}
-
-
}
-} \ No newline at end of file
+}