You are viewing a plain text version of this content. The canonical link for it is here.
Posted to server-dev@james.apache.org by rd...@apache.org on 2008/12/01 22:33:30 UTC

svn commit: r722245 - /james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java

Author: rdonkin
Date: Mon Dec  1 13:33:30 2008
New Revision: 722245

URL: http://svn.apache.org/viewvc?rev=722245&view=rev
Log:
Ensure socket work copes with more than one line per read OK.

Modified:
    james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java

Modified: james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java
URL: http://svn.apache.org/viewvc/james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java?rev=722245&r1=722244&r2=722245&view=diff
==============================================================================
--- james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java (original)
+++ james/mpt/trunk/main/src/main/java/org/apache/james/mpt/ExternalSession.java Mon Dec  1 13:33:30 2008
@@ -25,6 +25,9 @@
 
 final class ExternalSession implements Session {
 
+    /** Number of milliseconds to sleep after empty read */
+    private static final int SHORT_WAIT_FOR_INPUT = 10;
+
     private static final byte[] CRLF = { '\r', '\n' };
 
     private final SocketChannel socket;
@@ -73,32 +76,43 @@
 
     private void readlineInto(StringBuffer buffer) throws Exception {
         monitor.debug("[Reading line]");
-        while (socket.read(readBuffer) == 0)
-            ;
         readBuffer.flip();
-        while (readOneMore(buffer))
+        while (oneFromLine(buffer))
             ;
+//      May have partial read
         readBuffer.compact();
         monitor.debug("[Done]");
     }
 
-    private boolean readOneMore(StringBuffer buffer) throws Exception {
+    private boolean oneFromLine(StringBuffer buffer) throws Exception {
         final boolean result;
         if (readBuffer.hasRemaining()) {
             char next = (char) readBuffer.get();
             if (next == '\n') {
+                monitor.debug("[LF]");
+//              Reached end of the line
                 result = false;
             } else if (next == '\r') {
-                monitor.debug('\r');
+//              CRLF line endings so drop
+                monitor.debug("[CR]");
                 result = true;
             } else {
+//              Load buffer
                 monitor.debug(next);
                 buffer.append(next);
                 result = true;
             }
         } else {
+            monitor.debug("[Reading into buffer]");
             readBuffer.clear();
-            readlineInto(buffer);
+            while (socket.read(readBuffer) == 0) {
+//              No response yet
+//              Wait a little while
+                Thread.sleep(SHORT_WAIT_FOR_INPUT);
+            }
+//          Reset for transfer into string buffer
+            readBuffer.flip();
+            monitor.debug("[Done]");
             result = true;
         }
         return result;



---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org