Author: olegk
Date: Sat Nov 1 11:12:42 2014
New Revision: 1635923
URL: http://svn.apache.org/r1635923
Log:
MIME4J-218: improves defaultCharset handling
improves messages for limit exceptions with details about limit sizes
Contributed by Wolfgang Fahl <wf at bitplan.com>
Modified:
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.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/stream/MimeEntityTest.java
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
Modified:
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
(original)
+++
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/BufferedLineReaderInputStream.java
Sat Nov 1 11:12:42 2014
@@ -215,7 +215,7 @@ public class BufferedLineReaderInputStre
total += chunk;
}
if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
- throw new MaxLineLimitException("Maximum line length limit
exceeded");
+ throw new MaxLineLimitException("Maximum line length limit ("
+ this.maxLineLen +") exceeded");
}
}
if (total == 0 && bytesRead == -1) {
Modified:
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
(original)
+++
james/mime4j/trunk/core/src/main/java/org/apache/james/mime4j/io/LineReaderInputStreamAdaptor.java
Sat Nov 1 11:12:42 2014
@@ -92,7 +92,7 @@ public class LineReaderInputStreamAdapto
dst.append(ch);
total++;
if (this.maxLineLen > 0 && dst.length() >= this.maxLineLen) {
- throw new MaxLineLimitException("Maximum line length limit
exceeded");
+ throw new MaxLineLimitException("Maximum line length limit (
"+ this.maxLineLen +") exceeded");
}
if (ch == '\n') {
break;
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=1635923&r1=1635922&r2=1635923&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 Nov 1 11:12:42 2014
@@ -251,7 +251,7 @@ class MimeEntity implements EntityStateM
return false;
}
if (maxHeaderCount > 0 && headerCount >= maxHeaderCount) {
- throw new MaxHeaderLimitException("Maximum header limit
exceeded");
+ throw new MaxHeaderLimitException("Maximum header limit (" +
maxHeaderCount + ") exceeded");
}
headerCount++;
fieldBuilder.reset();
Modified:
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
(original)
+++
james/mime4j/trunk/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java
Sat Nov 1 11:12:42 2014
@@ -433,6 +433,8 @@ public class MimeEntityTest extends Test
fail("MimeException caused by MaxLineLimitException should have
been thrown");
} catch (MimeException expected) {
assertTrue(expected.getCause() instanceof MaxLineLimitException);
+ // make sure the exception contains the information about the
current maxlinelen setting
+
assertTrue(expected.getMessage().contains(""+config.getMaxLineLen()));
}
}
@@ -488,6 +490,8 @@ public class MimeEntityTest extends Test
entity.advance();
fail("MimeException caused by MaxLineLimitException should have
been thrown");
} catch (MaxHeaderLengthLimitException expected) {
+ // make sure the message contains the current setting of
maxheaderlen
+
assertTrue(expected.getMessage().contains(""+config.getMaxHeaderLen()));
}
}
@@ -582,6 +586,8 @@ public class MimeEntityTest extends Test
entity.advance();
fail("MaxHeaderLimitException should have been thrown");
} catch (MaxHeaderLimitException expected) {
+ // make sure the message contains the current setting of
maxheadercount
+
assertTrue(expected.getMessage().contains(""+config.getMaxHeaderCount()));
}
}
Modified:
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
(original)
+++
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/BasicBodyFactory.java
Sat Nov 1 11:12:42 2014
@@ -43,44 +43,55 @@ public class BasicBodyFactory implements
public static final BasicBodyFactory INSTANCE = new BasicBodyFactory();
- private final boolean lenient;
+ private final Charset defaultCharset;
public BasicBodyFactory() {
this(true);
}
+ public BasicBodyFactory(final Charset defaultCharset) {
+ this.defaultCharset = defaultCharset;
+ }
+
public BasicBodyFactory(final boolean lenient) {
- this.lenient = lenient;
+ this(lenient ? Charset.defaultCharset() : null);
+ }
+
+ /**
+ * @return the defaultCharset
+ */
+ public Charset getDefaultCharset() {
+ return defaultCharset;
}
/**
* select the Charset for the given mimeCharset string
- *
- * if you need support for non standard or invalid mimeCharset
specifications
- * you might want to create your own derived BodyFactory extending
BasicBodyFactory and
- * overriding this method as suggested by:
- * https://issues.apache.org/jira/browse/MIME4J-218
- *
- * the default behavior is lenient, invalid mimeCharset specifications
will return the defaultCharset
- *
- * @param mimeCharset - the string specification for a Charset e.g.
"UTF-8"
- * @throws UnsupportedEncodingException if the mimeCharset is invalid
- */
+ * <p/>
+ * if you need support for non standard or invalid mimeCharset
specifications you might want to
+ * create your own derived BodyFactory extending BasicBodyFactory and
overriding this method as
+ * suggested by: https://issues.apache.org/jira/browse/MIME4J-218
+ * <p/>
+ * the default behavior is lenient, invalid mimeCharset specifications
will return the
+ * defaultCharset
+ *
+ * @param mimeCharset - the string specification for a Charset e.g. "UTF-8"
+ * @throws UnsupportedEncodingException if the mimeCharset is invalid
+ */
protected Charset resolveCharset(final String mimeCharset) throws
UnsupportedEncodingException {
if (mimeCharset != null) {
try {
return Charset.forName(mimeCharset);
} catch (UnsupportedCharsetException ex) {
- if (!lenient) {
+ if (defaultCharset == null) {
throw new UnsupportedEncodingException(mimeCharset);
}
} catch (IllegalCharsetNameException ex) {
- if (!lenient) {
+ if (defaultCharset == null) {
throw new UnsupportedEncodingException(mimeCharset);
}
}
}
- return Charset.defaultCharset();
+ return defaultCharset;
}
public TextBody textBody(final String text, final String mimeCharset)
throws UnsupportedEncodingException {
Modified:
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
(original)
+++
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/DefaultMessageBuilder.java
Sat Nov 1 11:12:42 2014
@@ -302,7 +302,7 @@ public class DefaultMessageBuilder imple
BodyDescriptorBuilder bdb = bodyDescBuilder != null ?
bodyDescBuilder :
new DefaultBodyDescriptorBuilder(null, fieldParser != null ?
fieldParser :
strict ? DefaultFieldParser.getParser() :
LenientFieldParser.getParser(), mon);
- BodyFactory bf = bodyFactory != null ? bodyFactory : new
BasicBodyFactory(!strict);
+ BodyFactory bf = bodyFactory != null ? bodyFactory : new
BasicBodyFactory();
MimeStreamParser parser = new MimeStreamParser(cfg, mon, bdb);
parser.setContentHandler(new ParserStreamContentHandler(message,
bf));
parser.setContentDecoding(contentDecoding);
Modified:
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
(original)
+++
james/mime4j/trunk/dom/src/main/java/org/apache/james/mime4j/message/MessageBuilder.java
Sat Nov 1 11:12:42 2014
@@ -898,7 +898,7 @@ public class MessageBuilder extends Abst
BodyDescriptorBuilder currentBodyDescBuilder = bodyDescBuilder != null
? bodyDescBuilder :
new DefaultBodyDescriptorBuilder(null, fieldParser != null ?
fieldParser :
strict ? DefaultFieldParser.getParser() :
LenientFieldParser.getParser(), currentMonitor);
- BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory :
new BasicBodyFactory(!strict);
+ BodyFactory currentBodyFactory = bodyFactory != null ? bodyFactory :
new BasicBodyFactory();
MimeStreamParser parser = new MimeStreamParser(currentConfig,
currentMonitor, currentBodyDescBuilder);
Message message = new MessageImpl();
Modified:
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
URL:
http://svn.apache.org/viewvc/james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java?rev=1635923&r1=1635922&r2=1635923&view=diff
==============================================================================
---
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
(original)
+++
james/mime4j/trunk/dom/src/test/java/org/apache/james/mime4j/dom/MessageCharsetLenientTest.java
Sat Nov 1 11:12:42 2014
@@ -99,7 +99,8 @@ public class MessageCharsetLenientTest {
// test in bosh states
for (boolean lenient : lenientstates) {
// set how lenient we are
- builder.setBodyFactory(new BasicBodyFactory(lenient));
+ BasicBodyFactory basicBodyFactory = new
BasicBodyFactory(lenient );
+ builder.setBodyFactory(basicBodyFactory);
// check the list of invalid Charsets
for (String invalidCharset : invalidCharsets) {
// create a message with the charset