Author: rdonkin Date: Wed Jul 9 13:13:50 2008 New Revision: 675333 URL: http://svn.apache.org/viewvc?rev=675333&view=rev Log: MIME4J-30 Transfer-encoding should be transparent, https://issues.apache.org/jira/browse/MIME4J-30. Committed patch contributed by Oleg Kalnichevski. Introduces transparent encoding but makes it optional.
Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java?rev=675333&r1=675332&r2=675333&view=diff ============================================================================== --- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java (original) +++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeStreamParser.java Wed Jul 9 13:13:50 2008 @@ -35,17 +35,36 @@ * parser.setContentHandler(handler); * parser.parse(new FileInputStream("mime.msg")); * </pre> - * <strong>NOTE:</strong> All lines must end with CRLF - * (<code>\r\n</code>). If you are unsure of the line endings in your stream - * you should wrap it in a [EMAIL PROTECTED] org.apache.james.mime4j.EOLConvertingInputStream} instance. - * * * @version $Id: MimeStreamParser.java,v 1.8 2005/02/11 10:12:02 ntherning Exp $ */ public class MimeStreamParser { + private ContentHandler handler = null; + private boolean contentDecoding; private final MimeTokenStream mimeTokenStream = new MimeTokenStream(); + public MimeStreamParser() { + super(); + this.contentDecoding = false; + } + + /** + * Determines whether this parser automatically decodes body content + * based on the on the MIME fields with the standard defaults. + */ + public boolean isContentDecoding() { + return contentDecoding; + } + + /** + * Defines whether parser should automatically decode body content + * based on the on the MIME fields with the standard defaults. + */ + public void setContentDecoding(boolean b) { + this.contentDecoding = b; + } + /** * Parses a stream of bytes containing a MIME message. * @@ -59,7 +78,14 @@ int state = mimeTokenStream.getState(); switch (state) { case MimeTokenStream.T_BODY: - handler.body(mimeTokenStream.getBodyDescriptor(), mimeTokenStream.getInputStream()); + BodyDescriptor desc = mimeTokenStream.getBodyDescriptor(); + InputStream bodyContent; + if (contentDecoding) { + bodyContent = mimeTokenStream.getDecodedInputStream(); + } else { + bodyContent = mimeTokenStream.getInputStream(); + } + handler.body(desc, bodyContent); break; case MimeTokenStream.T_END_BODYPART: handler.endBodyPart(); Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java?rev=675333&r1=675332&r2=675333&view=diff ============================================================================== --- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java (original) +++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/MimeTokenStream.java Wed Jul 9 13:13:50 2008 @@ -239,9 +239,11 @@ } /** + * This method returns the raw entity, preamble, or epilogue contents. + * <p/> * This method is valid, if [EMAIL PROTECTED] #getState()} returns either of * [EMAIL PROTECTED] #T_RAW_ENTITY}, [EMAIL PROTECTED] #T_PREAMBLE}, or [EMAIL PROTECTED] #T_EPILOGUE}. - * It returns the raw entity, preamble, or epilogue contents. + * * @return Data stream, depending on the current state. * @throws IllegalStateException [EMAIL PROTECTED] #getState()} returns an * invalid value. @@ -249,6 +251,29 @@ public InputStream getInputStream() { return currentStateMachine.getContentStream(); } + + /** + * This method returns a transfer decoded stream based on the MIME + * fields with the standard defaults. + * <p/> + * This method is valid, if [EMAIL PROTECTED] #getState()} returns either of + * [EMAIL PROTECTED] #T_RAW_ENTITY}, [EMAIL PROTECTED] #T_PREAMBLE}, or [EMAIL PROTECTED] #T_EPILOGUE}. + * + * @return Data stream, depending on the current state. + * @throws IllegalStateException [EMAIL PROTECTED] #getState()} returns an + * invalid value. + */ + public InputStream getDecodedInputStream() { + BodyDescriptor bodyDescriptor = getBodyDescriptor(); + String transferEncoding = bodyDescriptor.getTransferEncoding(); + InputStream dataStream = currentStateMachine.getContentStream(); + if (MimeUtil.isBase64Encoding(transferEncoding)) { + dataStream = new Base64InputStream(dataStream); + } else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) { + dataStream = new QuotedPrintableInputStream(dataStream); + } + return dataStream; + } /** * Gets a reader configured for the current body or body part. @@ -270,25 +295,14 @@ public Reader getReader() { final BodyDescriptor bodyDescriptor = getBodyDescriptor(); final String mimeCharset = bodyDescriptor.getCharset(); - final String transferEncoding = bodyDescriptor.getTransferEncoding(); final Charset charset; if (mimeCharset == null || "".equals(mimeCharset)) { charset = Charset.forName("US-ASCII"); } else { charset = Charset.forName(mimeCharset); } - - final InputStream inputStream; - final InputStream transferEncodedStream = getInputStream(); - if (MimeUtil.isBase64Encoding(transferEncoding)) { - inputStream = new Base64InputStream(transferEncodedStream); - } else if (MimeUtil.isQuotedPrintableEncoded(transferEncoding)) { - inputStream = new QuotedPrintableInputStream(transferEncodedStream); - } else { - inputStream = transferEncodedStream; - } - final InputStreamReader result = new InputStreamReader(inputStream, charset); - return result; + final InputStream instream = getDecodedInputStream(); + return new InputStreamReader(instream, charset); } /** Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java?rev=675333&r1=675332&r2=675333&view=diff ============================================================================== --- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java (original) +++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/MimeStreamParserTest.java Wed Jul 9 13:13:50 2008 @@ -449,7 +449,45 @@ } } } + + public void testAutomaticContentDecoding() throws Exception { + MimeStreamParser parser = new MimeStreamParser(); + parser.setContentDecoding(true); + TestHandler handler = new TestHandler(); + parser.setContentHandler(handler); + String msg = "Subject: Yada yada\r\n" + + "From: [EMAIL PROTECTED]" + + "Content-Type: application/octet-stream\r\n" + + "Content-Transfer-Encoding: base64\r\n" + + "\r\n" + + "V2hvIGF0ZSBteSBjYWtlPwo="; + String expected = "<message>\r\n" + + "<header>\r\n" + + "<field>\r\n" + + "Subject: Yada yada" + + "</field>\r\n" + + "<field>\r\n" + + "From: [EMAIL PROTECTED]" + + "</field>\r\n" + + "<field>\r\n" + + "Content-Type: application/octet-stream" + + "</field>\r\n" + + "<field>\r\n" + + "Content-Transfer-Encoding: base64" + + "</field>\r\n" + + "</header>\r\n" + + "<body>\r\n" + + "Who ate my cake?\n" + + "</body>\r\n" + + "</message>\r\n"; + + parser.parse(new ByteArrayInputStream(msg.getBytes())); + String result = handler.sb.toString(); + + assertEquals(expected, result); + } + private static class TestHandler implements ContentHandler { private StringBuffer sb = new StringBuffer(); --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]