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]