You are viewing a plain text version of this content. The canonical link for it is here.
Posted to mime4j-dev@james.apache.org by mw...@apache.org on 2009/02/03 21:15:10 UTC

svn commit: r740408 - in /james/mime4j/trunk/src: main/java/org/apache/james/mime4j/field/Field.java main/java/org/apache/james/mime4j/util/MimeUtil.java test/java/org/apache/james/mime4j/util/MimeUtilTest.java

Author: mwiederkehr
Date: Tue Feb  3 20:15:10 2009
New Revision: 740408

URL: http://svn.apache.org/viewvc?rev=740408&view=rev
Log:
added MimeUtil.unfold(String)

Modified:
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Field.java
    james/mime4j/trunk/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
    james/mime4j/trunk/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Field.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Field.java?rev=740408&r1=740407&r2=740408&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Field.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/field/Field.java Tue Feb  3 20:15:10 2009
@@ -23,6 +23,7 @@
 import java.util.regex.Pattern;
 
 import org.apache.james.mime4j.MimeException;
+import org.apache.james.mime4j.util.MimeUtil;
 
 /**
  * The base class of all field classes.
@@ -98,7 +99,7 @@
         /*
          * Unfold the field.
          */
-        final String unfolded = raw.replaceAll("\r|\n", "");
+        final String unfolded = MimeUtil.unfold(raw);
         
         /*
          * Split into name and value.
@@ -144,7 +145,7 @@
         String raw = name + ": " + body;
 
         // Unfold body
-        body = body.replaceAll("\r|\n", "");
+        body = MimeUtil.unfold(body);
 
         return parser.parse(name, body, raw);
     }

Modified: james/mime4j/trunk/src/main/java/org/apache/james/mime4j/util/MimeUtil.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/main/java/org/apache/james/mime4j/util/MimeUtil.java?rev=740408&r1=740407&r2=740408&view=diff
==============================================================================
--- james/mime4j/trunk/src/main/java/org/apache/james/mime4j/util/MimeUtil.java (original)
+++ james/mime4j/trunk/src/main/java/org/apache/james/mime4j/util/MimeUtil.java Tue Feb  3 20:15:10 2009
@@ -175,19 +175,8 @@
     @SuppressWarnings("fallthrough")
     public static Map<String, String> getHeaderParams(String pValue) {
         pValue = pValue.trim();
-        
-        /*
-         * Unfold Content-Type value
-         */
-        StringBuilder sb = new StringBuilder(128);
-        for (int i = 0; i < pValue.length(); i++) {
-            char c = pValue.charAt(i);
-            if (c == '\r' || c == '\n') {
-                continue;
-            }
-            sb.append(c);
-        }
-        pValue = sb.toString();
+
+        pValue = unfold(pValue);
         
         Map<String, String> result = new HashMap<String, String>();
 
@@ -467,6 +456,43 @@
         }
     }
 
+    /**
+     * Unfold a multiple-line representation into a single line.
+     * 
+     * @param s
+     *            string to unfold.
+     * @return unfolded string.
+     */
+    public static String unfold(String s) {
+        final int length = s.length();
+        for (int idx = 0; idx < length; idx++) {
+            char c = s.charAt(idx);
+            if (c == '\r' || c == '\n') {
+                return unfold0(s, idx);
+            }
+        }
+
+        return s;
+    }
+
+    private static String unfold0(String s, int crlfIdx) {
+        final int length = s.length();
+        StringBuilder sb = new StringBuilder(length);
+
+        if (crlfIdx > 0) {
+            sb.append(s.substring(0, crlfIdx));
+        }
+
+        for (int idx = crlfIdx + 1; idx < length; idx++) {
+            char c = s.charAt(idx);
+            if (c != '\r' && c != '\n') {
+                sb.append(c);
+            }
+        }
+
+        return sb.toString();
+    }
+
     private static int indexOfWsp(String s, int fromIndex) {
         final int len = s.length();
         for (int index = fromIndex; index < len; index++) {

Modified: james/mime4j/trunk/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java
URL: http://svn.apache.org/viewvc/james/mime4j/trunk/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java?rev=740408&r1=740407&r2=740408&view=diff
==============================================================================
--- james/mime4j/trunk/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java (original)
+++ james/mime4j/trunk/src/test/java/org/apache/james/mime4j/util/MimeUtilTest.java Tue Feb  3 20:15:10 2009
@@ -17,7 +17,6 @@
  * under the License.                                           *
  ****************************************************************/
 
-
 package org.apache.james.mime4j.util;
 
 import junit.framework.TestCase;
@@ -44,4 +43,28 @@
         assertEquals(expected, MimeUtil.fold(input, 0));
     }
 
+    public void testUnfold() throws Exception {
+        assertEquals("", MimeUtil.unfold(""));
+        assertEquals("x", MimeUtil.unfold("x"));
+        assertEquals(" x ", MimeUtil.unfold(" x "));
+
+        assertEquals("", MimeUtil.unfold("\r"));
+        assertEquals("", MimeUtil.unfold("\n"));
+        assertEquals("", MimeUtil.unfold("\r\n"));
+
+        assertEquals(" ", MimeUtil.unfold(" \n"));
+        assertEquals(" ", MimeUtil.unfold("\n "));
+        assertEquals(" ", MimeUtil.unfold(" \r\n"));
+        assertEquals(" ", MimeUtil.unfold("\r\n "));
+
+        assertEquals("this is a test", MimeUtil.unfold("this is\r\n a test"));
+        assertEquals("this is a test", MimeUtil.unfold("this is\r\n a test"));
+        assertEquals("this is a test", MimeUtil.unfold("this\r\n is a test"));
+        assertEquals("this     is a test", MimeUtil
+                .unfold("this  \r\n   is a test"));
+
+        assertEquals("this is a test", MimeUtil
+                .unfold("this\r\n is\r\n a\r\n test"));
+    }
+
 }