You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by ba...@apache.org on 2010/03/27 22:13:15 UTC
svn commit: r928280 - in /james/mime4j/trunk/core/src:
main/java/org/apache/james/mime4j/io/
main/java/org/apache/james/mime4j/stream/ test/java/org/apache/james/mime4j/
test/java/org/apache/james/mime4j/stream/ test/resources/testmsgs/
Author: bago
Date: Sat Mar 27 21:13:15 2010
New Revision: 928280
URL: http://svn.apache.org/viewvc?rev=928280&view=rev
Log:
Altered parser to skip the T_PREAMBLE token when there is no preamble in the input message. Updated tests to avoid expecting T_PREAMBLE. Updated roundtrip tests expectation with the right results. (MIME4J-177)
Modified:
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/ExampleMail.java
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.java
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.java
james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.out
james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.xml
james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries_decoded.xml
james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.out
james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.xml
james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary_decoded.xml
Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/MimeBoundaryInputStream.java Sat Mar 27 21:13:15 2010
@@ -42,6 +42,13 @@ public class MimeBoundaryInputStream ext
private BufferedLineReaderInputStream buffer;
/**
+ * Store the first buffer length.
+ * Used to distinguish between an empty preamble and
+ * no preamble.
+ */
+ private int initialLength;
+
+ /**
* Creates a new MimeBoundaryInputStream.
*
* @param inbuffer The underlying stream.
@@ -61,6 +68,7 @@ public class MimeBoundaryInputStream ext
this.atBoundary = false;
this.boundaryLen = 0;
this.lastPart = false;
+ this.initialLength = -1;
this.completed = false;
this.boundary = new byte[boundary.length() + 2];
@@ -222,9 +230,14 @@ public class MimeBoundaryInputStream ext
return bytesRead;
}
+ public boolean isEmptyStream() {
+ return initialLength == 0;
+ }
+
private void calculateBoundaryLen() throws IOException {
boundaryLen = boundary.length;
int len = limit - buffer.pos();
+ if (len >= 0 && initialLength == -1) initialLength = len;
if (len > 0) {
if (buffer.charAt(limit - 1) == '\n') {
boundaryLen++;
Modified: james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java (original)
+++ james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/stream/MimeEntity.java Sat Mar 27 21:13:15 2010
@@ -138,11 +138,14 @@ public class MimeEntity extends Abstract
if (dataStream.isUsed()) {
advanceToBoundary();
state = EntityStates.T_END_MULTIPART;
+ break;
} else {
createMimePartStream();
state = EntityStates.T_PREAMBLE;
+
+ if (!currentMimePartStream.isEmptyStream()) break;
+ // continue to next state
}
- break;
case EntityStates.T_PREAMBLE:
// removed specific code. Fallback to T_IN_BODYPART that
// better handle missing parts.
Modified: james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/ExampleMail.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/ExampleMail.java?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/ExampleMail.java (original)
+++ james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/ExampleMail.java Sat Mar 27 21:13:15 2010
@@ -165,8 +165,8 @@ public class ExampleMail {
"<html><head><title>Rhubarb</title></head><body>Rhubarb!</body></html>\r\n" +
"\r\n--1729--\r\n" +
"This is the epilogue\r\n";
-
- public static final String MULTIPART_WITH_BINARY_ATTACHMENTS =
+
+ public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER =
"Return-Path: <ro...@blueyonder.co.uk>\r\n" +
"Received: (qmail 18554 invoked from network); 25 May 2008 14:38:53 -0000\r\n" +
"Received: from unknown (HELO p3presmtp01-16.prod.phx3.secureserver.net)\r\n" +
@@ -216,9 +216,9 @@ public class ExampleMail {
"X-Nonspam: None\r\n" +
"X-fetched-from: mail.xmlmapt.org\r\n" +
"X-Evolution-Source: imap://rob@thebes/\r\n" +
- "\r\n" +
- "\r\n" +
- "--=-tIdGYVstQJghyEDATnJ+\r\n" +
+ "\r\n";
+
+ public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_BODY = "--=-tIdGYVstQJghyEDATnJ+\r\n" +
"Content-Type: text/plain\r\n" +
"Content-Transfer-Encoding: 7bit\r\n" +
"\r\n" +
@@ -316,7 +316,19 @@ public class ExampleMail {
"Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb Rhubarb\r\n" +
"\r\n" +
"--=-tIdGYVstQJghyEDATnJ+--\r\n";
-
+
+ public static final String MULTIPART_WITH_BINARY_ATTACHMENTS = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER +
+ "\r\n" + MULTIPART_WITH_BINARY_ATTACHMENTS_BODY;
+
+ public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER +
+ MULTIPART_WITH_BINARY_ATTACHMENTS_BODY;
+
+ public static final String MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE = MULTIPART_WITH_BINARY_ATTACHMENTS_HEADER +
+ "This is a preamble\r\n" +
+ "With 2 lines\r\n" + MULTIPART_WITH_BINARY_ATTACHMENTS_BODY +
+ "This is an epilogue\r\n" +
+ "With 2 lines\r\n";
+
public static final String ONE_PART_MIME_ASCII_BODY = "A single part MIME mail.\r\n";
public static final String RFC822_SIMPLE_BODY = "This is a very simple email.\r\n";
@@ -633,6 +645,8 @@ public class ExampleMail {
public static final byte[] ONE_PART_MIME_ASCII_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII).array();
public static final byte[] ONE_PART_MIME_8859_BYTES = LATIN1.encode(ONE_PART_MIME_8859).array();
public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS).array();
+ public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS_NOPREAMBLE).array();
+ public static final byte[] MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE_BYTES = US_ASCII.encode(MULTIPART_WITH_BINARY_ATTACHMENTS_PREAMBLE_EPILOGUE).array();
public static final byte[] ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII_COMMENT_IN_MIME_VERSION).array();
public static final byte[] ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES_BYTES = US_ASCII.encode(ONE_PART_MIME_ASCII_MIME_VERSION_SPANS_TWO_LINES).array();
public static final byte[] MAIL_WITH_RFC822_PART_BYTES = ascii(MAIL_WITH_RFC822_PART);
Modified: james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.java?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.java (original)
+++ james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeTokenNoRecurseTest.java Sat Mar 27 21:13:15 2010
@@ -108,7 +108,8 @@ public class MimeTokenNoRecurseTest exte
nextIs(MimeTokenStream.T_FIELD);
nextIs(MimeTokenStream.T_END_HEADER);
nextIs(MimeTokenStream.T_START_MULTIPART);
- nextIs(MimeTokenStream.T_PREAMBLE);
+ // an empty preamble should not raise a T_PREAMBLE event
+ // nextIs(MimeTokenStream.T_PREAMBLE);
nextShouldBeStandardPart(true);
nextShouldBeStandardPart(true);
nextIs(MimeTokenStream.T_EPILOGUE);
Modified: james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.java?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
--- james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.java (original)
+++ james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MultipartTokensTest.java Sat Mar 27 21:13:15 2010
@@ -153,13 +153,15 @@ public class MultipartTokensTest extends
checkState(MimeTokenStream.T_FIELD);
checkState(MimeTokenStream.T_END_HEADER);
checkState(MimeTokenStream.T_START_MULTIPART);
- checkState(MimeTokenStream.T_PREAMBLE);
+ // an empty preamble should not rais a T_PREAMBLE event
+ // checkState(MimeTokenStream.T_PREAMBLE);
checkState(MimeTokenStream.T_START_BODYPART);
checkState(MimeTokenStream.T_START_HEADER);
checkState(MimeTokenStream.T_FIELD);
checkState(MimeTokenStream.T_END_HEADER);
checkState(MimeTokenStream.T_START_MULTIPART);
- checkState(MimeTokenStream.T_PREAMBLE);
+ // an empty preamble should not rais a T_PREAMBLE event
+ // checkState(MimeTokenStream.T_PREAMBLE);
checkState(MimeTokenStream.T_START_BODYPART);
checkState(MimeTokenStream.T_START_HEADER);
checkState(MimeTokenStream.T_FIELD);
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.out
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.out?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.xml
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries.xml?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries_decoded.xml
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/ending-boundaries_decoded.xml?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.out
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.out?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.xml
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary.xml?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.
Modified: james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary_decoded.xml
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/resources/testmsgs/misplaced-boundary_decoded.xml?rev=928280&r1=928279&r2=928280&view=diff
==============================================================================
Binary files - no diff available.