You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@maven.apache.org by ol...@apache.org on 2013/10/22 05:04:40 UTC
[2/9] git commit: Refactored connection initialization and management
code; removed single connection mode
Refactored connection initialization and management code; removed single connection mode
Project: http://git-wip-us.apache.org/repos/asf/maven-wagon/repo
Commit: http://git-wip-us.apache.org/repos/asf/maven-wagon/commit/e8c135d8
Tree: http://git-wip-us.apache.org/repos/asf/maven-wagon/tree/e8c135d8
Diff: http://git-wip-us.apache.org/repos/asf/maven-wagon/diff/e8c135d8
Branch: refs/heads/master
Commit: e8c135d88e1730c068907625113d6ba116067225
Parents: 16f0f9d
Author: Oleg Kalnichevski <ol...@apache.org>
Authored: Sat Sep 21 12:36:50 2013 +0200
Committer: Oleg Kalnichevski <ol...@apache.org>
Committed: Tue Sep 24 13:47:26 2013 +0200
----------------------------------------------------------------------
.../providers/http/AbstractHttpClientWagon.java | 192 ++++++-------------
.../providers/http/RelaxedX509TrustManager.java | 23 +--
.../wagon/providers/http/HttpWagonTest.java | 8 -
3 files changed, 69 insertions(+), 154 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/e8c135d8/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java
index d195fae..dd4fb8e 100755
--- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java
+++ b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/AbstractHttpClientWagon.java
@@ -28,18 +28,15 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.ByteBuffer;
-import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.TimeZone;
+import java.util.concurrent.TimeUnit;
import javax.net.ssl.HttpsURLConnection;
-import javax.net.ssl.SSLException;
-import javax.net.ssl.SSLSession;
-import javax.net.ssl.SSLSocket;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
@@ -63,22 +60,18 @@ import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.client.utils.DateUtils;
import org.apache.http.config.Registry;
import org.apache.http.config.RegistryBuilder;
-import org.apache.http.conn.HttpClientConnectionManager;
import org.apache.http.conn.socket.ConnectionSocketFactory;
import org.apache.http.conn.socket.PlainConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
-import org.apache.http.conn.ssl.X509HostnameVerifier;
import org.apache.http.entity.AbstractHttpEntity;
import org.apache.http.impl.auth.BasicScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.impl.client.BasicCredentialsProvider;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
-import org.apache.http.impl.conn.BasicHttpClientConnectionManager;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.apache.http.message.BasicHeader;
import org.apache.http.protocol.HTTP;
-import org.apache.http.util.TextUtils;
import org.apache.maven.wagon.InputData;
import org.apache.maven.wagon.OutputData;
import org.apache.maven.wagon.PathUtils;
@@ -223,7 +216,7 @@ public abstract class AbstractHttpClientWagon
protected static final int SC_NULL = -1;
- protected static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" );
+ private static final TimeZone GMT_TIME_ZONE = TimeZone.getTimeZone( "GMT" );
private CloseableHttpClient client;
@@ -232,163 +225,92 @@ public abstract class AbstractHttpClientWagon
private Closeable closeable;
/**
- * @since 2.0
- */
- protected static HttpClientConnectionManager connectionManagerPooled;
-
- /**
- * @since 2.0
- */
- protected HttpClientConnectionManager clientConnectionManager = new BasicHttpClientConnectionManager(
- createSocketFactoryRegistry() );
-
- /**
* use http(s) connection pool mechanism.
* <b>enabled by default</b>
- *
- * @since 2.0
*/
- protected static boolean useClientManagerPooled =
- Boolean.valueOf( System.getProperty( "maven.wagon.http.pool", "true" ) );
+ private final static boolean PERSISTENT_POOL =
+ Boolean.valueOf( System.getProperty( "maven.wagon.http.pool", "true" ) );
/**
* skip failure on certificate validity checks.
* <b>disabled by default</b>
- *
- * @since 2.0
*/
- protected static boolean sslInsecure = Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.insecure", "false" ) );
+ private final static boolean SSL_INSECURE =
+ Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.insecure", "false" ) );
/**
* if using sslInsecure, certificate date issues will be ignored
* <b>disabled by default</b>
- *
- * @since 2.0
*/
- protected static boolean IGNORE_SSL_VALIDITY_DATES =
- Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.ignore.validity.dates", "false" ) );
+ private final static boolean IGNORE_SSL_VALIDITY_DATES =
+ Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.ignore.validity.dates", "false" ) );
/**
* If enabled, ssl hostname verifier does not check hostname. Disable this will use a browser compat hostname verifier
* <b>disabled by default</b>
- *
- * @since 2.0
- * @see RelaxedHostNameVerifier
*/
- protected static boolean sslAllowAll =
- Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.allowall", "false" ) );
+ private final static boolean SSL_ALLOW_ALL =
+ Boolean.valueOf( System.getProperty( "maven.wagon.http.ssl.allowall", "false" ) );
- private static String[] split(final String s) {
- if (TextUtils.isBlank(s)) {
- return null;
- }
- return s.split(" *, *");
- }
- private static Registry<ConnectionSocketFactory> createSocketFactoryRegistry()
+ /**
+ * Maximum conncurrent connections per distinct route.
+ * <b>20 by default</b>
+ */
+ private final static int MAX_CONN_PER_ROUTE =
+ Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxPerRoute", "20" ) );
+
+ /**
+ * Maximum conncurrent connections in total.
+ * <b>40 by default</b>
+ */
+ private final static int MAX_CONN_TOTAL =
+ Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxTotal", "40" ) );
+
+ /**
+ * Internal connection manager
+ */
+ private static final PoolingHttpClientConnectionManager connManager = createConnManager();
+
+ private static PoolingHttpClientConnectionManager createConnManager()
{
- String[] sslProtocols = split(System.getProperty("https.protocols"));
- String[] cipherSuites = split(System.getProperty("https.cipherSuites"));
- SSLConnectionSocketFactory sslSocketFactory;
- if ( sslInsecure )
+
+ String sslProtocolsStr = System.getProperty("https.protocols");
+ String cipherSuitesStr = System.getProperty("https.cipherSuites");
+ String[] sslProtocols = sslProtocolsStr != null ? sslProtocolsStr.split(" *, *") : null;
+ String[] cipherSuites = cipherSuitesStr != null ? cipherSuitesStr.split(" *, *") : null;
+
+ SSLConnectionSocketFactory sslConnectionSocketFactory;
+ if ( SSL_INSECURE )
{
- try
- {
- sslSocketFactory = new SSLConnectionSocketFactory(
- RelaxedX509TrustManager.createRelaxedSSLContext(),
- sslProtocols,
- cipherSuites,
- sslAllowAll ? new RelaxedHostNameVerifier() : SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER );
- }
- catch ( IOException e )
- {
- throw new RuntimeException( "failed to init SSLSocket Factory " + e.getMessage(), e );
- }
+ sslConnectionSocketFactory = new SSLConnectionSocketFactory(
+ RelaxedX509TrustManager.createRelaxedSSLContext(IGNORE_SSL_VALIDITY_DATES),
+ sslProtocols,
+ cipherSuites,
+ SSL_ALLOW_ALL ? SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER : SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER );
}
else
{
- sslSocketFactory = new SSLConnectionSocketFactory(
+ sslConnectionSocketFactory = new SSLConnectionSocketFactory(
HttpsURLConnection.getDefaultSSLSocketFactory(),
sslProtocols,
cipherSuites,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER );
}
- return RegistryBuilder.<ConnectionSocketFactory>create()
+
+ Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.INSTANCE)
- .register("https", sslSocketFactory)
+ .register("https", sslConnectionSocketFactory)
.build();
- }
-
- static
- {
- if ( !useClientManagerPooled )
- {
- System.out.println( "http connection pool disabled in wagon http" );
- }
- else
- {
- PoolingHttpClientConnectionManager poolingClientConnectionManager =
- new PoolingHttpClientConnectionManager( createSocketFactoryRegistry() );
- int maxPerRoute =
- Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxPerRoute", "20" ) );
- poolingClientConnectionManager.setDefaultMaxPerRoute( maxPerRoute );
- int maxTotal = Integer.parseInt( System.getProperty( "maven.wagon.httpconnectionManager.maxTotal", "40" ) );
- poolingClientConnectionManager.setDefaultMaxPerRoute( maxPerRoute );
- poolingClientConnectionManager.setMaxTotal( maxTotal );
-
- connectionManagerPooled = poolingClientConnectionManager;
- }
- }
-
- /**
- * disable all host name verification
- *
- * @since 2.0
- */
- private static class RelaxedHostNameVerifier
- implements X509HostnameVerifier
- {
- public void verify( String s, SSLSocket sslSocket )
- throws IOException
- {
- //no op
- }
-
- public void verify( String s, X509Certificate x509Certificate )
- throws SSLException
- {
- //no op
- }
- public void verify( String s, String[] strings, String[] strings1 )
- throws SSLException
- {
- //no op
+ PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager( registry );
+ if (PERSISTENT_POOL) {
+ connManager.setDefaultMaxPerRoute( MAX_CONN_PER_ROUTE );
+ connManager.setMaxTotal( MAX_CONN_TOTAL );
+ } else {
+ connManager.setMaxTotal( 1 );
}
-
- public boolean verify( String s, SSLSession sslSession )
- {
- return true;
- }
- }
-
- public HttpClientConnectionManager getConnectionManager()
- {
- if ( !useClientManagerPooled )
- {
- return clientConnectionManager;
- }
- return connectionManagerPooled;
- }
-
- public static void setConnectionManagerPooled( HttpClientConnectionManager clientConnectionManager )
- {
- connectionManagerPooled = clientConnectionManager;
- }
-
- public static void setUseClientManagerPooled( boolean pooledClientManager )
- {
- useClientManagerPooled = pooledClientManager;
+ return connManager;
}
/**
@@ -475,7 +397,7 @@ public abstract class AbstractHttpClientWagon
client = HttpClientBuilder.create()
.useSystemProperties()
.disableConnectionState()
- .setConnectionManager(getConnectionManager())
+ .setConnectionManager(connManager)
.setProxy(proxy)
.setDefaultCredentialsProvider(credentialsProvider)
.build();
@@ -483,9 +405,9 @@ public abstract class AbstractHttpClientWagon
public void closeConnection()
{
- if ( !useClientManagerPooled )
+ if ( !PERSISTENT_POOL)
{
- getConnectionManager().shutdown();
+ connManager.closeIdleConnections(0, TimeUnit.MILLISECONDS);
}
}
http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/e8c135d8/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedX509TrustManager.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedX509TrustManager.java b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedX509TrustManager.java
index f0d14eb..6d54059 100644
--- a/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedX509TrustManager.java
+++ b/wagon-providers/wagon-http/src/main/java/org/apache/maven/wagon/providers/http/RelaxedX509TrustManager.java
@@ -19,6 +19,8 @@ package org.apache.maven.wagon.providers.http;
* under the License.
*/
+import org.apache.http.conn.ssl.SSLInitializationException;
+
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
@@ -37,34 +39,32 @@ import java.security.cert.X509Certificate;
*
* @author Olivier Lamy
* @since 2.0
- * @see AbstractHttpClientWagon.IGNORE_SSL_VALIDITY_DATES
*/
public class RelaxedX509TrustManager
implements X509TrustManager
{
- private X509TrustManager standardTrustManager = null;
+ private final X509TrustManager standardTrustManager;
+ private final boolean ignoreSSLValidityDates;
- protected static SSLContext createRelaxedSSLContext()
- throws IOException
+ public static SSLContext createRelaxedSSLContext( boolean ignoreSSLValidityDates )
{
try
{
SSLContext context = SSLContext.getInstance( "SSL" );
- context.init( null, new TrustManager[]{ new RelaxedX509TrustManager( null ) }, null );
+ context.init( null, new TrustManager[]{
+ new RelaxedX509TrustManager( null, ignoreSSLValidityDates ) }, null );
return context;
}
catch ( Exception e )
{
- IOException ioe = new IOException( e.getMessage() );
- ioe.initCause( e );
- throw ioe;
+ throw new SSLInitializationException(e.getMessage(), e);
}
}
/**
* Constructor for EasyX509TrustManager.
*/
- public RelaxedX509TrustManager( KeyStore keystore )
+ public RelaxedX509TrustManager( KeyStore keystore, boolean ignoreSSLValidityDates )
throws NoSuchAlgorithmException, KeyStoreException
{
super();
@@ -76,6 +76,7 @@ public class RelaxedX509TrustManager
throw new NoSuchAlgorithmException( "no trust manager found" );
}
this.standardTrustManager = (X509TrustManager) trustmanagers[0];
+ this.ignoreSSLValidityDates = ignoreSSLValidityDates;
}
/**
@@ -102,14 +103,14 @@ public class RelaxedX509TrustManager
}
catch ( CertificateExpiredException e )
{
- if ( !AbstractHttpClientWagon.IGNORE_SSL_VALIDITY_DATES )
+ if ( !ignoreSSLValidityDates )
{
throw e;
}
}
catch ( CertificateNotYetValidException e )
{
- if ( !AbstractHttpClientWagon.IGNORE_SSL_VALIDITY_DATES )
+ if ( !ignoreSSLValidityDates )
{
throw e;
}
http://git-wip-us.apache.org/repos/asf/maven-wagon/blob/e8c135d8/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
----------------------------------------------------------------------
diff --git a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
index edc7538..9552cbe 100755
--- a/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
+++ b/wagon-providers/wagon-http/src/test/java/org/apache/maven/wagon/providers/http/HttpWagonTest.java
@@ -52,14 +52,6 @@ public class HttpWagonTest
( (HttpWagon) wagon ).setHttpConfiguration( config );
}
- public void testDefaultPooledConnectionManager()
- throws Exception
- {
- HttpWagon wagon = (HttpWagon) lookup( Wagon.class, "http" );
- assertTrue( wagon.getConnectionManager() instanceof PoolingHttpClientConnectionManager );
-
- }
-
@Override
protected boolean supportPreemptiveAuthenticationPut()
{