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()
     {