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 2007/02/03 21:39:45 UTC

svn commit: r503301 - in /jakarta/httpcomponents/httpcore/trunk/module-nio/src: main/java/org/apache/http/impl/nio/reactor/ test/java/org/apache/http/nio/mockup/ test/java/org/apache/http/nio/protocol/

Author: olegk
Date: Sat Feb  3 12:39:44 2007
New Revision: 503301

URL: http://svn.apache.org/viewvc?view=rev&rev=503301
Log:
* Removed synchronization of the sessions sets as the sessions are added and removed from the session sets by the reactor thread only
* Added test cases for HTTP/1.0 POSTs

Modified:
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractIOReactor.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/BaseIOReactor.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/SessionSet.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/mockup/TestHttpServiceBase.java
    jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/protocol/TestNIOHttp.java

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractIOReactor.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractIOReactor.java?view=diff&rev=503301&r1=503300&r2=503301
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractIOReactor.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/AbstractIOReactor.java Sat Feb  3 12:39:44 2007
@@ -221,17 +221,15 @@
     }
 
     private void closeSessions() {
-        synchronized (this.sessions) {
-            for (Iterator it = this.sessions.iterator(); it.hasNext(); ) {
-                IOSession session = (IOSession) it.next();
-                if (!session.isClosed()) {    
+        for (Iterator it = this.sessions.iterator(); it.hasNext(); ) {
+            IOSession session = (IOSession) it.next();
+            if (!session.isClosed()) {    
 
-                    session.close();
-                    this.eventDispatch.disconnected(session);
-                }
+                session.close();
+                this.eventDispatch.disconnected(session);
             }
-            this.sessions.clear();
         }
+        this.sessions.clear();
     }
     
     public void shutdown() throws IOReactorException {

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/BaseIOReactor.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/BaseIOReactor.java?view=diff&rev=503301&r1=503300&r2=503301
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/BaseIOReactor.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/BaseIOReactor.java Sat Feb  3 12:39:44 2007
@@ -94,30 +94,28 @@
                 }
             }
         }
-        synchronized (this.bufferingSessions) {
-            if (!this.bufferingSessions.isEmpty()) {
-                for (Iterator it = this.bufferingSessions.iterator(); it.hasNext(); ) {
-                    IOSession session = (IOSession) it.next();
-                    SessionBufferStatus bufStatus = session.getBufferStatus();
-                    if (bufStatus != null) {
-                        if (!bufStatus.hasBufferedInput()) {
-                            it.remove();
-                            continue;
-                        }
+        if (!this.bufferingSessions.isEmpty()) {
+            for (Iterator it = this.bufferingSessions.iterator(); it.hasNext(); ) {
+                IOSession session = (IOSession) it.next();
+                SessionBufferStatus bufStatus = session.getBufferStatus();
+                if (bufStatus != null) {
+                    if (!bufStatus.hasBufferedInput()) {
+                        it.remove();
+                        continue;
                     }
-                    try {
-                        int ops = session.getEventMask();
-                        if ((ops & EventMask.READ) > 0) {
-                            this.eventDispatch.inputReady(session);
-                            if (bufStatus != null) {
-                                if (!bufStatus.hasBufferedInput()) {
-                                    it.remove();
-                                }
+                }
+                try {
+                    int ops = session.getEventMask();
+                    if ((ops & EventMask.READ) > 0) {
+                        this.eventDispatch.inputReady(session);
+                        if (bufStatus != null) {
+                            if (!bufStatus.hasBufferedInput()) {
+                                it.remove();
                             }
                         }
-                    } catch (CancelledKeyException ex) {
-                        it.remove();
                     }
+                } catch (CancelledKeyException ex) {
+                    it.remove();
                 }
             }
         }

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/SessionSet.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/SessionSet.java?view=diff&rev=503301&r1=503300&r2=503301
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/SessionSet.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/main/java/org/apache/http/impl/nio/reactor/SessionSet.java Sat Feb  3 12:39:44 2007
@@ -46,25 +46,25 @@
         this.set = new HashSet();
     }
 
-    public synchronized void add(final IOSession session) {
+    public void add(final IOSession session) {
         if (session == null) {
             return;
         }
         this.set.add(session);
     }
 
-    public synchronized boolean remove(final IOSession session) {
+    public boolean remove(final IOSession session) {
         if (session == null) {
             return false;
         }
         return this.set.remove(session);
     }
 
-    public synchronized void clear() {
+    public void clear() {
         this.set.clear();
     }
 
-    public synchronized boolean isEmpty() {
+    public boolean isEmpty() {
         return this.set.isEmpty();
     }
     

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/mockup/TestHttpServiceBase.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/mockup/TestHttpServiceBase.java?view=diff&rev=503301&r1=503300&r2=503301
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/mockup/TestHttpServiceBase.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/mockup/TestHttpServiceBase.java Sat Feb  3 12:39:44 2007
@@ -74,6 +74,10 @@
         return this.connCount;
     }
     
+    public HttpParams getParams() {
+        return this.params;
+    }
+    
     private void incrementConnCount() {
         synchronized (this.mutex) {
             this.connCount++;

Modified: jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/protocol/TestNIOHttp.java
URL: http://svn.apache.org/viewvc/jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/protocol/TestNIOHttp.java?view=diff&rev=503301&r1=503300&r2=503301
==============================================================================
--- jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/protocol/TestNIOHttp.java (original)
+++ jakarta/httpcomponents/httpcore/trunk/module-nio/src/test/java/org/apache/http/nio/protocol/TestNIOHttp.java Sat Feb  3 12:39:44 2007
@@ -43,6 +43,7 @@
 import org.apache.http.HttpException;
 import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
+import org.apache.http.HttpVersion;
 import org.apache.http.entity.ByteArrayEntity;
 import org.apache.http.entity.StringEntity;
 import org.apache.http.message.HttpGet;
@@ -51,6 +52,7 @@
 import org.apache.http.nio.mockup.TestHttpClient;
 import org.apache.http.nio.mockup.TestHttpServer;
 import org.apache.http.nio.protocol.HttpRequestExecutionHandler;
+import org.apache.http.params.HttpProtocolParams;
 import org.apache.http.protocol.HttpContext;
 import org.apache.http.protocol.HttpExecutionContext;
 import org.apache.http.protocol.HttpRequestHandler;
@@ -524,5 +526,153 @@
         }
         
     }
+
+    /**
+     * This test case executes a series of simple (non-pipelined) HTTP/1.0 
+     * POST requests over multiple persistent connections. 
+     */
+    public void testSimpleHttpPostsHTTP10() throws Exception {
+        
+        final int connNo = 3;
+        final int reqNo = 20;
+        
+        Random rnd = new Random();
+        
+        // Prepare some random data
+        final List testData = new ArrayList(reqNo);
+        for (int i = 0; i < reqNo; i++) {
+            int size = rnd.nextInt(5000);
+            byte[] data = new byte[size];
+            rnd.nextBytes(data);
+            testData.add(data);
+        }
+        
+        List[] responseData = new List[connNo];
+        for (int i = 0; i < responseData.length; i++) {
+            responseData[i] = new ArrayList();
+        }
+        
+        // Initialize the server-side request handler
+        this.server.registerHandler("*", new HttpRequestHandler() {
+            
+
+            public void handle(
+                    final HttpRequest request, 
+                    final HttpResponse response, 
+                    final HttpContext context) throws HttpException, IOException {
+                
+                if (request instanceof HttpEntityEnclosingRequest) {
+                    HttpEntity incoming = ((HttpEntityEnclosingRequest) request).getEntity();
+                    byte[] data = EntityUtils.toByteArray(incoming);
+                    
+                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
+                    outgoing.setChunked(false);
+                    response.setEntity(outgoing);
+                } else {
+                    StringEntity outgoing = new StringEntity("No content"); 
+                    response.setEntity(outgoing);
+                }
+            }
+            
+        });
+        
+        // Initialize the client side request executor
+        // Set protocol level to HTTP/1.0
+        this.client.getParams().setParameter(
+                HttpProtocolParams.PROTOCOL_VERSION, HttpVersion.HTTP_1_0);
+        this.client.setHttpRequestExecutionHandler(new HttpRequestExecutionHandler() {
+
+            public void initalizeContext(final HttpContext context, final Object attachment) {
+                context.setAttribute("LIST", (List) attachment);
+                context.setAttribute("STATUS", "ready");
+            }
+
+            public HttpRequest submitRequest(final HttpContext context) {
+                NHttpConnection conn = (NHttpConnection) context.getAttribute(
+                        HttpExecutionContext.HTTP_CONNECTION);
+                String status = (String) context.getAttribute("STATUS");
+                if (!status.equals("ready")) {
+                    return null;
+                }
+                int index = 0;
+                
+                Integer intobj = (Integer) context.getAttribute("INDEX");
+                if (intobj != null) {
+                    index = intobj.intValue();
+                }
+
+                HttpPost post = null;
+                if (index < reqNo) {
+                    post = new HttpPost("/?" + index);
+                    byte[] data = (byte[]) testData.get(index);
+                    ByteArrayEntity outgoing = new ByteArrayEntity(data);
+                    post.setEntity(outgoing);
+                    
+                    context.setAttribute("INDEX", new Integer(index + 1));
+                    context.setAttribute("STATUS", "busy");
+                } else {
+                    try {
+                        conn.close();
+                    } catch (IOException ex) {
+                        ex.printStackTrace();
+                    }
+                }
+                
+                return post;
+            }
+            
+            public void handleResponse(final HttpResponse response, final HttpContext context) {
+                NHttpConnection conn = (NHttpConnection) context.getAttribute(
+                        HttpExecutionContext.HTTP_CONNECTION);
+                
+                List list = (List) context.getAttribute("LIST");
+                try {
+                    HttpEntity entity = response.getEntity();
+                    byte[] data = EntityUtils.toByteArray(entity);
+                    list.add(data);
+                } catch (IOException ex) {
+                    fail(ex.getMessage());
+                }
+
+                context.setAttribute("STATUS", "ready");
+                conn.requestInput();
+            }
+            
+        });
+        
+        this.server.start();
+        this.client.start();
+        
+        InetSocketAddress serverAddress = (InetSocketAddress) this.server.getSocketAddress();
+        
+        for (int i = 0; i < responseData.length; i++) {
+            this.client.openConnection(
+                    new InetSocketAddress("localhost", serverAddress.getPort()), 
+                    responseData[i]);
+        }
+     
+        this.client.await(connNo, 1000);
+        assertEquals(connNo, this.client.getConnCount());
+        
+        this.server.await(connNo, 1000);
+        assertEquals(connNo, this.server.getConnCount());
+
+        for (int c = 0; c < responseData.length; c++) {
+            List receivedPackets = responseData[c];
+            List expectedPackets = testData;
+            assertEquals(receivedPackets.size(), expectedPackets.size());
+            for (int p = 0; p < testData.size(); p++) {
+                byte[] expected = (byte[]) testData.get(p);
+                byte[] received = (byte[]) receivedPackets.get(p);
+                
+                assertEquals(expected.length, received.length);
+                for (int i = 0; i < expected.length; i++) {
+                    assertEquals(expected[i], received[i]);
+                }
+            }
+        }
+        
+    }
+
     
 }