Author: norman
Date: Tue May 10 15:11:57 2011
New Revision: 1101497

URL: http://svn.apache.org/viewvc?rev=1101497&view=rev
Log:
Make sure the extra-dotting is handled the right way. This fix hung pop3 
session. See JAMES-1222

Removed:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/Ascii7BitInputStream.java
Modified:
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ExtraDotInputStream.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
    
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
    
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ExtraDotInputStream.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ExtraDotInputStream.java?rev=1101497&r1=1101496&r2=1101497&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ExtraDotInputStream.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/ExtraDotInputStream.java
 Tue May 10 15:11:57 2011
@@ -21,6 +21,7 @@ package org.apache.james.pop3server.core
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.PushbackInputStream;
 
 import org.apache.james.pop3server.ReadByteFilterInputStream;
 
@@ -30,71 +31,34 @@ import org.apache.james.pop3server.ReadB
  */
 public class ExtraDotInputStream extends ReadByteFilterInputStream {
 
-    byte[] buf = new byte[3];
-    int pos = 0;
-    boolean end = false;
-    boolean extraDot = false;
-    boolean startLine;
-    int last;
+    boolean startLine = true;
+    private int last;
 
     public ExtraDotInputStream(InputStream in) {
-        super(in);
+        super(new PushbackInputStream(in, 2));
         startLine = true;
     }
 
+    
     @Override
-    public synchronized int read() throws IOException {
-        if (end)
-            return -1;
-
-        if (startLine) {
-            int i = 0;
-            // check if we still have something in the buffer
-            // if so we need to copy it so we don't lose data
-
-            // See JAMES-1152
-            if (pos != -1 && pos != 0) {
-                byte[] tmpBuf = new byte[3];
-                while (pos < buf.length) {
-                    tmpBuf[i++] = buf[pos++];
-                }
-
-                buf = tmpBuf;
-            }
-            while (i < buf.length) {
-                buf[i++] = (byte) in.read();
-            }
-            if (buf[0] == '.' && buf[1] == '\r' && buf[2] == '\n') {
-                extraDot = true;
-            }
-            startLine = false;
-            pos = 0;
-        }
-
-        int a;
-        if (pos == -1) {
-            a = in.read();
-        } else {
-            if (extraDot) {
-                extraDot = false;
-                return '.';
-            } else {
-                a = buf[pos++];
-
-                if (pos == buf.length) {
-                    pos = -1;
-                }
-                if (a == -1) {
-                    end = true;
-                }
-            }
-
-        }
-        if (last == '\r' && a == '\n') {
-            startLine = true;
-        }
-        last = a;
-        return a;
+    public int read() throws IOException {
+       PushbackInputStream pin = (PushbackInputStream) in;
+       int i = pin.read();
+       if (startLine) {
+           startLine = false;
+           if (i == '.') {
+               pin.unread(i);
+               return '.';
+           }
+           
+       }
+      
+       if (last == '\r' && i == '\n') {
+           startLine = true;
+       }
+       last = i;
+       return i;
+       
 
     }
 

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java?rev=1101497&r1=1101496&r2=1101497&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/core/TopCmdHandler.java
 Tue May 10 15:11:57 2011
@@ -129,7 +129,7 @@ public class TopCmdHandler extends RetrC
                                 bodyIn = createInputStream(content);
                             }
                             // write body
-                            session.writeStream(new 
CountingBodyInputStream(new CRLFTerminatedInputStream(bodyIn), lines));
+                            session.writeStream(new 
CountingBodyInputStream(new ExtraDotInputStream(new 
CRLFTerminatedInputStream(bodyIn)), lines));
 
                         } finally {
                             // write a single dot to mark message as complete

Modified: 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java?rev=1101497&r1=1101496&r2=1101497&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
 (original)
+++ 
james/server/trunk/pop3server/src/main/java/org/apache/james/pop3server/netty/POP3NettySession.java
 Tue May 10 15:11:57 2011
@@ -18,7 +18,6 @@
  ****************************************************************/
 package org.apache.james.pop3server.netty;
 
-import java.io.InputStream;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -118,10 +117,4 @@ public class POP3NettySession extends Ab
     public void setUserMailbox(MessageManager mailbox) {
         this.mailbox = mailbox;
     }
-
-    @Override
-    public void writeStream(InputStream stream) {
-        super.writeStream(new Ascii7BitInputStream(stream));
-    }
-
 }

Modified: 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java
URL: 
http://svn.apache.org/viewvc/james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java?rev=1101497&r1=1101496&r2=1101497&view=diff
==============================================================================
--- 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java
 (original)
+++ 
james/server/trunk/pop3server/src/test/java/org/apache/james/pop3server/ExtraDotInputStreamTest.java
 Tue May 10 15:11:57 2011
@@ -35,20 +35,22 @@ public class ExtraDotInputStreamTest ext
 
     }
 
-    public void testNoExtraDotOnDoubleDot() throws IOException {
+    public void testExtraDotOnDoubleDot() throws IOException {
         String data = "This\r\n..\r\nThis.\r\n";
-        
-        checkRead(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), data);
-        checkReadViaArray(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), data);
+        String expectedOutput = "This\r\n...\r\nThis.\r\n";
+
+        checkRead(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), expectedOutput);
+        checkReadViaArray(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), expectedOutput);
 
     }
     
 
-    public void testNoExtraDotOnDotWithText() throws IOException {
+    public void testExtraDotOnDotWithText() throws IOException {
         String data = "This\r\n.TestText\r\nThis.\r\n";
-        
-        checkRead(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), data);
-        checkReadViaArray(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), data);
+        String expected = "This\r\n..TestText\r\nThis.\r\n";
+
+        checkRead(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), expected);
+        checkReadViaArray(new ExtraDotInputStream(new 
ByteArrayInputStream(data.getBytes())), expected);
 
     }
     



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to