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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]