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 ni...@apache.org on 2008/07/11 10:58:24 UTC
svn commit: r675871 - in /james/mime4j/trunk/src:
main/java/org/apache/james/mime4j/MimeEntity.java
test/java/org/apache/james/mime4j/MultipartTokensTest.java
Author: niklas
Date: Fri Jul 11 01:58:23 2008
New Revision: 675871
URL: http://svn.apache.org/viewvc?rev=675871&view=rev
Log:
Resolved MIME4J-48: Messages containing qp or base64 encoded embedded messages should now parse as expected.
Modified:
james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeEntity.java
james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java
Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeEntity.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeEntity.java?rev=675871&r1=675870&r2=675871&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeEntity.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeEntity.java Fri Jul 11 01:58:23 2008
@@ -191,14 +191,18 @@
private EntityStateMachine nextMessage() {
String transferEncoding = body.getTransferEncoding();
InputStream instream;
+ InputBuffer buffer;
if (MimeUtil.isBase64Encoding(transferEncoding)) {
log.debug("base64 encoded message/rfc822 detected");
- instream = new Base64InputStream(mimeStream);
+ instream = new Base64InputStream(dataStream);
+ buffer = new InputBuffer(instream, 4 * 1024);
} else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) {
log.debug("quoted-printable encoded message/rfc822 detected");
- instream = new QuotedPrintableInputStream(mimeStream);
+ instream = new QuotedPrintableInputStream(dataStream);
+ buffer = new InputBuffer(instream, 4 * 1024);
} else {
instream = dataStream;
+ buffer = inbuffer;
}
if (recursionMode == RecursionMode.M_RAW) {
@@ -208,7 +212,7 @@
MimeEntity message = new MimeEntity(
rootStream,
instream,
- inbuffer,
+ buffer,
body,
EntityStates.T_START_MESSAGE,
EntityStates.T_END_MESSAGE,
Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java?rev=675871&r1=675870&r2=675871&view=diff
==============================================================================
--- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java (original)
+++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MultipartTokensTest.java Fri Jul 11 01:58:23 2008
@@ -23,6 +23,8 @@
import java.io.IOException;
import java.nio.charset.Charset;
+import org.apache.commons.io.IOUtils;
+
import junit.framework.TestCase;
public class MultipartTokensTest extends TestCase {
@@ -62,6 +64,31 @@
"\r\n" +
"--42--\r\n";
+ public static final String COMPLEX_QP_MESSAGE =
+ "Content-Transfer-Encoding: quoted-printable\r\n" +
+ "Content-Type: message/rfc822; charset=us-ascii\r\n" +
+ "\r\n" +
+ "Subject: The subject\r\n" +
+ "Content-Type: multipart/alternative;\r\n" +
+ " boundary=3D=22----=3DNextPart=22\r\n" +
+ "\r\n" +
+ "This is a multi-part message in MIME format.\r\n" +
+ "\r\n" +
+ "------=3DNextPart\r\n" +
+ "Content-Type: text/plain;\r\n" +
+ " charset=3D=22iso-8859-1=22\r\n" +
+ "\r\n" +
+ "Some text\r\n" +
+ "\r\n" +
+ "------=3DNextPart\r\n" +
+ "Content-Type: text/html;\r\n" +
+ " charset=3D=22iso-8859-1=22\r\n" +
+ "\r\n" +
+ "<HTML><BODY>=3D Some HTML =3D</BODY></HTML>\r\n" +
+ "------=3DNextPart--\r\n" +
+ "\r\n" +
+ "\r\n";
+
MimeTokenStream parser;
protected void setUp() throws Exception {
@@ -201,6 +228,46 @@
checkState(MimeTokenStream.T_END_OF_STREAM);
}
+ public void testShouldParseMessagesWithEmbeddedQuotedPrintableEncodedMessage() throws Exception {
+ parser.parse(new ByteArrayInputStream(US_ASCII.encode(COMPLEX_QP_MESSAGE).array()));
+ checkState(MimeTokenStream.T_START_HEADER);
+ checkState(MimeTokenStream.T_FIELD);
+ checkState(MimeTokenStream.T_FIELD);
+ checkState(MimeTokenStream.T_END_HEADER);
+ checkState(MimeTokenStream.T_START_MESSAGE);
+ checkState(MimeTokenStream.T_START_HEADER);
+ checkState(MimeTokenStream.T_FIELD);
+ checkState(MimeTokenStream.T_FIELD);
+ checkState(MimeTokenStream.T_END_HEADER);
+ checkState(MimeTokenStream.T_START_MULTIPART);
+ 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_BODY);
+ assertEquals("text/plain", parser.getBodyDescriptor().getMimeType());
+ assertEquals("iso-8859-1", parser.getBodyDescriptor().getCharset());
+ assertEquals("Some text\r\n",
+ IOUtils.toString(parser.getInputStream()));
+ checkState(MimeTokenStream.T_END_BODYPART);
+ checkState(MimeTokenStream.T_START_BODYPART);
+ checkState(MimeTokenStream.T_START_HEADER);
+ checkState(MimeTokenStream.T_FIELD);
+ checkState(MimeTokenStream.T_END_HEADER);
+ checkState(MimeTokenStream.T_BODY);
+ assertEquals("text/html", parser.getBodyDescriptor().getMimeType());
+ assertEquals("iso-8859-1", parser.getBodyDescriptor().getCharset());
+ assertEquals("<HTML><BODY>= Some HTML =</BODY></HTML>",
+ IOUtils.toString(parser.getInputStream()));
+ checkState(MimeTokenStream.T_END_BODYPART);
+ checkState(MimeTokenStream.T_EPILOGUE);
+ checkState(MimeTokenStream.T_END_MULTIPART);
+ checkState(MimeTokenStream.T_END_MESSAGE);
+ checkState(MimeTokenStream.T_END_MESSAGE);
+ checkState(MimeTokenStream.T_END_OF_STREAM);
+ }
+
public void testMultipartMessageWithoutHeader() throws Exception {
parser.parseHeadless(new ByteArrayInputStream(US_ASCII.encode(BODY).array()),
"multipart/mixed;boundary=1729");
---------------------------------------------------------------------
To unsubscribe, e-mail: server-dev-unsubscribe@james.apache.org
For additional commands, e-mail: server-dev-help@james.apache.org