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]