Repository: tomee
Updated Branches:
  refs/heads/tomee-1.7.x 1a633869b -> 41d223eff


TOMEE-1623 ensuring to reuse the same ssl socket factory accross connection to 
be aligned on JVM caching key for keep alive - this map is quite static which 
is not that good for server usage but all client is done this way, we should 
add classloader as key somewhere


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/6f4a535f
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/6f4a535f
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/6f4a535f

Branch: refs/heads/tomee-1.7.x
Commit: 6f4a535fac33f67012a130feac869f64d67d0c50
Parents: 1a63386
Author: Romain Manni-Bucau <rmann...@starbucks.com>
Authored: Thu Aug 6 03:09:47 2015 -0700
Committer: Jonathan Gallimore <j...@jrg.me.uk>
Committed: Sat Aug 27 22:46:48 2016 +0100

----------------------------------------------------------------------
 .../openejb/client/HttpConnectionFactory.java   | 21 +++++++++++++++++---
 .../openejb/client/HttpsConnectionTest.java     |  4 +++-
 2 files changed, 21 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/6f4a535f/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
----------------------------------------------------------------------
diff --git 
a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
 
b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
index 7eee7dd..a576f13 100644
--- 
a/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
+++ 
b/server/openejb-client/src/main/java/org/apache/openejb/client/HttpConnectionFactory.java
@@ -28,26 +28,32 @@ import java.net.URL;
 import java.security.KeyManagementException;
 import java.security.NoSuchAlgorithmException;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 
 /**
  * @version $Revision$ $Date$
  */
 public class HttpConnectionFactory implements ConnectionFactory {
+    // this map only ensures JVM keep alive socket caching works properly
+    private final ConcurrentMap<URI, SSLSocketFactory> socketFactoryMap = new 
ConcurrentHashMap<>();
 
     @Override
     public Connection getConnection(final URI uri) throws IOException {
-        return new HttpConnection(uri);
+        return new HttpConnection(uri, socketFactoryMap);
     }
 
     public static class HttpConnection implements Connection {
+        private final ConcurrentMap<URI, SSLSocketFactory> socketFactoryMap;
 
         private HttpURLConnection httpURLConnection;
         private InputStream inputStream;
         private OutputStream outputStream;
         private final URI uri;
 
-        public HttpConnection(final URI uri) throws IOException {
+        public HttpConnection(final URI uri, final ConcurrentMap<URI, 
SSLSocketFactory> socketFactoryMap) throws IOException {
             this.uri = uri;
+            this.socketFactoryMap = socketFactoryMap;
             final URL url = uri.toURL();
 
             final Map<String, String> params;
@@ -75,7 +81,16 @@ public class HttpConnectionFactory implements 
ConnectionFactory {
 
             if (params.containsKey("sslKeyStore") || 
params.containsKey("sslTrustStore")) {
                 try {
-                    ((HttpsURLConnection) 
httpURLConnection).setSSLSocketFactory(new 
SSLContextBuilder(params).build().getSocketFactory());
+                    SSLSocketFactory sslSocketFactory = 
socketFactoryMap.get(uri);
+                    if (sslSocketFactory == null) {
+                        sslSocketFactory = new 
SSLContextBuilder(params).build().getSocketFactory();
+                        final SSLSocketFactory existing = 
socketFactoryMap.putIfAbsent(uri, sslSocketFactory);
+                        if (existing != null) {
+                            sslSocketFactory = existing;
+                        }
+                    }
+
+                    ((HttpsURLConnection) 
httpURLConnection).setSSLSocketFactory(sslSocketFactory);
                 } catch (final NoSuchAlgorithmException e) {
                     throw new ClientRuntimeException(e.getMessage(), e);
                 } catch (final KeyManagementException e) {

http://git-wip-us.apache.org/repos/asf/tomee/blob/6f4a535f/server/openejb-client/src/test/java/org/apache/openejb/client/HttpsConnectionTest.java
----------------------------------------------------------------------
diff --git 
a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpsConnectionTest.java
 
b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpsConnectionTest.java
index 1ef609c..311ae3a 100644
--- 
a/server/openejb-client/src/test/java/org/apache/openejb/client/HttpsConnectionTest.java
+++ 
b/server/openejb-client/src/test/java/org/apache/openejb/client/HttpsConnectionTest.java
@@ -57,10 +57,11 @@ public class HttpsConnectionTest {
 
     @Test
     public void testHttps() throws URISyntaxException, IOException {
+        final HttpConnectionFactory factory = new HttpConnectionFactory();
         final String url = "https://"; + SERVER + ":" + SERVER_PORT + "/secure" 
+
             "?sslKeyStore=" + STORE_PATH + "&sslKeyStorePassword=" + STORE_PWD 
+ "&sslKeyStoreProvider=SunX509&sslKeyStoreType=jks" +
             "&sslTrustStore=" + STORE_PATH + "&sslTrustStorePassword=" + 
STORE_PWD + "&readTimeout=500";
-        final Connection connection = new 
HttpConnectionFactory().getConnection(new URI(url));
+        Connection connection = new HttpConnectionFactory().getConnection(new 
URI(url));
 
         BufferedReader br = null;
         final StringBuilder sb = new StringBuilder();
@@ -80,6 +81,7 @@ public class HttpsConnectionTest {
                     e.printStackTrace();
                 }
             }
+            connection.close();
         }
 
         Assert.assertTrue("should contain", sb.toString().contains("secure"));

Reply via email to