You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by ol...@apache.org on 2011/09/03 15:04:50 UTC

svn commit: r1164860 - in /httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http: impl/nio/ nio/ nio/reactor/ssl/

Author: olegk
Date: Sat Sep  3 13:04:49 2011
New Revision: 1164860

URL: http://svn.apache.org/viewvc?rev=1164860&view=rev
Log:
SSL I/O session initialization is now handled by the I/O event dispatch

Modified:
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/AbstractIODispatch.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpClientConnectionFactory.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpServerConnectionFactory.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/NHttpConnectionFactory.java
    httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/AbstractIODispatch.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/AbstractIODispatch.java?rev=1164860&r1=1164859&r2=1164860&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/AbstractIODispatch.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/AbstractIODispatch.java Sat Sep  3 13:04:49 2011
@@ -74,6 +74,18 @@ public abstract class AbstractIODispatch
                 session.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
             }
             onConnected(conn);
+            SSLIOSession ssliosession = (SSLIOSession) session.getAttribute(
+                    SSLIOSession.SESSION_KEY);
+            if (ssliosession != null) {
+                try {
+                    if (!ssliosession.isInitialized()) {
+                        ssliosession.initialize();
+                    }
+                } catch (IOException ex) {
+                    onException(conn, ex);
+                    ssliosession.shutdown();
+                }
+            }
         } catch (RuntimeException ex) {
             session.shutdown();
             throw ex;
@@ -99,6 +111,9 @@ public abstract class AbstractIODispatch
             	onInputReady(conn);
             } else {
                 try {
+                    if (!ssliosession.isInitialized()) {
+                        ssliosession.initialize();
+                    }
                     if (ssliosession.isAppInputReady()) {
                     	onInputReady(conn);
                     }
@@ -125,6 +140,9 @@ public abstract class AbstractIODispatch
                 onOutputReady(conn);
             } else {
                 try {
+                    if (!ssliosession.isInitialized()) {
+                        ssliosession.initialize();
+                    }
                     if (ssliosession.isAppOutputReady()) {
                         onOutputReady(conn);
                     }
@@ -147,10 +165,8 @@ public abstract class AbstractIODispatch
             SSLIOSession ssliosession = (SSLIOSession) session.getAttribute(
                     SSLIOSession.SESSION_KEY);
             ensureNotNull(conn);
-            if (ssliosession == null) {
-                onTimeout(conn);
-            } else {
-            	onTimeout(conn);
+            onTimeout(conn);
+            if (ssliosession != null) {
                 synchronized (ssliosession) {
                     if (ssliosession.isOutboundDone() && !ssliosession.isInboundDone()) {
                         // The session failed to terminate cleanly

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpClientConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpClientConnectionFactory.java?rev=1164860&r1=1164859&r2=1164860&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpClientConnectionFactory.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpClientConnectionFactory.java Sat Sep  3 13:04:49 2011
@@ -26,8 +26,6 @@
  */
 package org.apache.http.impl.nio;
 
-import java.io.IOException;
-
 import javax.net.ssl.SSLContext;
 
 import org.apache.http.HttpResponseFactory;
@@ -115,14 +113,13 @@ public class SSLNHttpClientConnectionFac
             final IOSession session,
             final HttpResponseFactory responseFactory,
             final ByteBufferAllocator allocator,
-            final HttpParams params) throws IOException {
+            final HttpParams params) {
         return new DefaultNHttpClientConnection(session, responseFactory, allocator, params);
     }
 
-    public NHttpClientConnection createConnection(final IOSession session) throws IOException {
+    public NHttpClientConnection createConnection(final IOSession session) {
         SSLContext sslcontext = this.sslcontext != null ? this.sslcontext : getDefaultSSLContext();
         SSLIOSession ssliosession = new SSLIOSession(session, SSLMode.CLIENT, sslcontext, this.sslHandler);
-        ssliosession.initialize();
         session.setAttribute(SSLIOSession.SESSION_KEY, ssliosession);
         return createConnection(ssliosession, this.responseFactory, this.allocator, this.params);
     }

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpServerConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpServerConnectionFactory.java?rev=1164860&r1=1164859&r2=1164860&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpServerConnectionFactory.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/impl/nio/SSLNHttpServerConnectionFactory.java Sat Sep  3 13:04:49 2011
@@ -26,8 +26,6 @@
  */
 package org.apache.http.impl.nio;
 
-import java.io.IOException;
-
 import javax.net.ssl.SSLContext;
 
 import org.apache.http.HttpRequestFactory;
@@ -115,14 +113,13 @@ public class SSLNHttpServerConnectionFac
             final IOSession session,
             final HttpRequestFactory requestFactory,
             final ByteBufferAllocator allocator,
-            final HttpParams params) throws IOException {
+            final HttpParams params) {
         return new DefaultNHttpServerConnection(session, requestFactory, allocator, params);
     }
 
-    public NHttpServerConnection createConnection(final IOSession session) throws IOException {
+    public NHttpServerConnection createConnection(final IOSession session) {
         SSLContext sslcontext = this.sslcontext != null ? this.sslcontext : getDefaultSSLContext();
         SSLIOSession ssliosession = new SSLIOSession(session, SSLMode.CLIENT, sslcontext, this.sslHandler);
-        ssliosession.initialize();
         session.setAttribute(SSLIOSession.SESSION_KEY, ssliosession);
         return createConnection(ssliosession, this.requestFactory, this.allocator, this.params);
     }

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/NHttpConnectionFactory.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/NHttpConnectionFactory.java?rev=1164860&r1=1164859&r2=1164860&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/NHttpConnectionFactory.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/NHttpConnectionFactory.java Sat Sep  3 13:04:49 2011
@@ -27,8 +27,6 @@
 
 package org.apache.http.nio;
 
-import java.io.IOException;
-
 import org.apache.http.nio.reactor.IOSession;
 
 /**
@@ -36,6 +34,6 @@ import org.apache.http.nio.reactor.IOSes
  */
 public interface NHttpConnectionFactory<T extends NHttpConnection> {
 
-	T createConnection(IOSession session) throws IOException;
+	T createConnection(IOSession session);
 
 }

Modified: httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java
URL: http://svn.apache.org/viewvc/httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java?rev=1164860&r1=1164859&r2=1164860&view=diff
==============================================================================
--- httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java (original)
+++ httpcomponents/httpcore/trunk/httpcore-nio/src/main/java/org/apache/http/nio/reactor/ssl/SSLIOSession.java Sat Sep  3 13:04:49 2011
@@ -76,6 +76,7 @@ public class SSLIOSession implements IOS
 
     private boolean endOfStream;
     private volatile int status;
+    private volatile boolean initialized;
 
     public SSLIOSession(
             final IOSession session,
@@ -122,7 +123,14 @@ public class SSLIOSession implements IOS
         return this.handler;
     }
 
+    public boolean isInitialized() {
+        return this.initialized;
+    }
+
     public synchronized void initialize(final SSLMode mode) throws SSLException {
+        if (this.initialized) {
+            throw new IllegalStateException("SSL I/O session already initialized");
+        }
         switch (mode) {
         case CLIENT:
             this.sslEngine.setUseClientMode(true);
@@ -134,6 +142,7 @@ public class SSLIOSession implements IOS
         if (this.handler != null) {
             this.handler.initalize(this.sslEngine);
         }
+        this.initialized = true;
         this.sslEngine.beginHandshake();
         doHandshake();
     }