/*
* Copyright 2014 Federal Chancellery Austria
* MOA-ID has been developed in a cooperation between BRZ, the Federal
* Chancellery Austria - ICT staff unit, and Graz University of Technology.
*
* Licensed under the EUPL, Version 1.1 or - as soon 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://www.osor.eu/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.
*
* This product combines work with different licenses. See the "NOTICE" text
* file for details on the various modules and licenses.
* The "NOTICE" text file is part of the distribution. Any derivative works
* that you distribute must include a readable copy of the "NOTICE" text file.
*/
package org.apache.commons.httpclient;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.StringTokenizer;
import org.apache.commons.httpclient.auth.AuthScope;
import org.apache.commons.httpclient.protocol.Protocol;
import org.apache.commons.httpclient.protocol.ProtocolSocketFactory;
import at.gv.egovernment.moa.logging.Logger;
import at.gv.egovernment.moa.util.MiscUtil;
/**
* @author tlenz
*
*HTTP client which can be used with MOA SSL TrustStore implementation
*
*/
public class MOAHttpClient extends HttpClient {
public MOAHttpClient() {
super();
}
public void setCustomSSLTrustStore(String metadataURL, ProtocolSocketFactory protoSocketFactory)
throws MalformedURLException {
URL url = new URL(metadataURL);
int port = -1;
if (url.getPort() < 0)
port = url.getDefaultPort();
else
port = url.getPort();
Protocol authhttps = new Protocol("https", protoSocketFactory, 443);
getHostConfiguration().setHost(url.getHost(), port, authhttps);
}
public int executeMethod(HostConfiguration hostconfig,
final HttpMethod method, final HttpState state)
throws IOException, HttpException {
if (method == null) {
throw new IllegalArgumentException("HttpMethod parameter may not be null");
}
HostConfiguration defaulthostconfig = getHostConfiguration();
if (hostconfig == null) {
hostconfig = defaulthostconfig;
}
URI uri = method.getURI();
if (hostconfig == defaulthostconfig || uri.isAbsoluteURI()) {
// make a deep copy of the host defaults
hostconfig = (HostConfiguration) hostconfig.clone();
/**
* Only build default host with default protocol if protocol is empty
*
* In case of https, the methode setCustomSSLTrustStore can be used to set a
* the MOA TrustStore for SSL connection validation
*/
if (uri.isAbsoluteURI() && hostconfig.getProtocol() == null) {
hostconfig.setHost(uri);
}
}
HttpState interalState = (state == null ? getState() : state);
if (requiresProxy(uri.getURI())) {
injectProxyCredentials(hostconfig, interalState);
}
HttpMethodDirector methodDirector = new HttpMethodDirector(
getHttpConnectionManager(),
hostconfig,
getParams(),
state);
methodDirector.executeMethod(method);
return method.getStatusCode();
}
public void injectProxyCredentials(HostConfiguration hostconfig, HttpState interalState) {
//set proxy functionality
String host = System.getProperty("http.proxyHost"); //$NON-NLS-1$
String port = System.getProperty("http.proxyPort"); //$NON-NLS-1$
String user = System.getProperty("http.proxyUser"); //$NON-NLS-1$
String pass = System.getProperty("http.proxyPassword"); //$NON-NLS-1$
if (MiscUtil.isNotEmpty(host)) {
int p = -1;
if (MiscUtil.isNotEmpty(port)) {
try {
p = Integer.parseInt(port);
} catch (Exception e) {
Logger.error("'http.proxyPort' not valid!", e);
}
}
Logger.debug("Set HTTP-Proxy to Host: " + host + " and port: " + p);
hostconfig.setProxy(host, p);
if (MiscUtil.isNotEmpty(user) && pass != null) {
//set proxy credentials
AuthScope authscope = new AuthScope(host, p);
Credentials credentials = new UsernamePasswordCredentials(user, pass);
interalState.setProxyCredentials(authscope, credentials);
Logger.debug(" Use Proxy with Username: " + user + " and password: "
+ (Logger.isTraceEnabled() ? pass : "*******"));
}
}
}
/**
* Return true unless the given target host is specified in the http.nonProxyHosts
system property (used for both protocols, http and https).
* See Networking Properties.
* @param targetHost Non-null host name to verify
* @return true if not specified in the list, false if it is specified and therefore should be excluded from proxy
*/
private static boolean requiresProxy(final String targetHost)
{
boolean requiresProxy = true;
final String nonProxyHosts = System.getProperty("http.nonProxyHosts");
if (nonProxyHosts != null)
{
StringTokenizer tokenizer = new StringTokenizer(nonProxyHosts, "|");
while (tokenizer.hasMoreTokens())
{
String pattern = tokenizer.nextToken();
pattern = pattern.replaceAll("\\.", "\\\\.").replaceAll("\\*", ".*");
if (targetHost.matches(pattern))
{
requiresProxy = false;
break;
}
}
}
return requiresProxy;
}
}