Author: norman
Date: Wed Jul 19 13:09:29 2006
New Revision: 423582

URL: http://svn.apache.org/viewvc?rev=423582&view=rev
Log:
Backport fix for JAMES-570 ( also related to  JAMES-264)

Added:
    
james/server/branches/v2.3/src/test/org/apache/james/core/MailHeadersTest.java
      - copied unchanged from r423509, 
james/server/trunk/src/test/org/apache/james/core/MailHeadersTest.java
Modified:
    james/server/branches/v2.3/src/java/org/apache/james/core/MailHeaders.java
    
james/server/branches/v2.3/src/java/org/apache/james/core/MimeMessageWrapper.java
    
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java
    
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageWrapperTest.java

Modified: 
james/server/branches/v2.3/src/java/org/apache/james/core/MailHeaders.java
URL: 
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/core/MailHeaders.java?rev=423582&r1=423581&r2=423582&view=diff
==============================================================================
--- james/server/branches/v2.3/src/java/org/apache/james/core/MailHeaders.java 
(original)
+++ james/server/branches/v2.3/src/java/org/apache/james/core/MailHeaders.java 
Wed Jul 19 13:09:29 2006
@@ -55,7 +55,8 @@
      *                            based on the stream
      */
     public MailHeaders(InputStream in) throws MessagingException {
-        super(in);
+        super();
+        load(in);
     }
 
     /**
@@ -97,6 +98,40 @@
     public boolean isSet(String name) {
         String[] value = super.getHeader(name);
         return (value != null && value.length != 0);
+    }
+
+    /**
+     * If the new header is a Return-Path we get sure that we add it to the top
+     * Javamail, at least until 1.4.0 does the wrong thing if it loaded a 
stream with 
+     * a return-path in the middle.
+     *
+     * @see javax.mail.internet.InternetHeaders#addHeader(java.lang.String, 
java.lang.String)
+     */
+    public void addHeader(String arg0, String arg1) {
+        if (RFC2822Headers.RETURN_PATH.equalsIgnoreCase(arg0)) {
+            headers.add(0, new InternetHeader(arg0, arg1));
+        } else {
+            super.addHeader(arg0, arg1);
+        }
+    }
+
+    /**
+     * If the new header is a Return-Path we get sure that we add it to the top
+     * Javamail, at least until 1.4.0 does the wrong thing if it loaded a 
stream with 
+     * a return-path in the middle.
+     *
+     * @see javax.mail.internet.InternetHeaders#setHeader(java.lang.String, 
java.lang.String)
+     */
+    public void setHeader(String arg0, String arg1) {
+        if (RFC2822Headers.RETURN_PATH.equalsIgnoreCase(arg0)) {
+            super.removeHeader(arg0);
+        }
+        super.setHeader(arg0, arg1);
+    }
+
+    protected Object clone() throws CloneNotSupportedException {
+        // TODO Auto-generated method stub
+        return super.clone();
     }
 
     /**

Modified: 
james/server/branches/v2.3/src/java/org/apache/james/core/MimeMessageWrapper.java
URL: 
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/java/org/apache/james/core/MimeMessageWrapper.java?rev=423582&r1=423581&r2=423582&view=diff
==============================================================================
--- 
james/server/branches/v2.3/src/java/org/apache/james/core/MimeMessageWrapper.java
 (original)
+++ 
james/server/branches/v2.3/src/java/org/apache/james/core/MimeMessageWrapper.java
 Wed Jul 19 13:09:29 2006
@@ -17,14 +17,19 @@
 
 package org.apache.james.core;
 
+import org.apache.avalon.framework.activity.Disposable;
+import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.james.util.InternetPrintWriter;
+import org.apache.james.util.io.IOUtil;
+
 import javax.activation.DataHandler;
 import javax.mail.MessagingException;
 import javax.mail.Session;
 import javax.mail.internet.InternetHeaders;
 import javax.mail.internet.MimeMessage;
+import javax.mail.util.SharedByteArrayInputStream;
 
 import java.io.BufferedWriter;
-import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -35,14 +40,6 @@
 import java.io.PrintWriter;
 import java.util.Enumeration;
 
-import org.apache.avalon.framework.activity.Disposable;
-import org.apache.avalon.framework.container.ContainerUtil;
-import org.apache.james.util.InternetPrintWriter;
-import org.apache.james.util.io.IOUtil;
-import org.apache.mailet.RFC2822Headers;
-
-import javax.mail.util.SharedByteArrayInputStream;
-
 /**
  * This object wraps a MimeMessage, only loading the underlying MimeMessage
  * object when needed.  Also tracks if changes were made to reduce
@@ -486,13 +483,9 @@
      * @see 
javax.mail.internet.MimeMessage#createInternetHeaders(java.io.InputStream)
      */
     protected synchronized InternetHeaders createInternetHeaders(InputStream 
is) throws MessagingException {
-
-        // Keep this: skip the headers from the stream
-        // we could put that code in the else and simple write an "header" 
skipping
-        // reader for the others.
-
-        
-        /* InternetHeaders can be a bit awkward to work with due to
+        /* This code is no more needed: see JAMES-570 and new tests
+           
+         * InternetHeaders can be a bit awkward to work with due to
          * its own internal handling of header order.  This hack may
          * not always be necessary, but for now we are trying to
          * ensure that there is a Return-Path header, even if just a
@@ -501,13 +494,19 @@
          * headers, and ensure that ours is on the top. addHeader
          * handles header order, but not setHeader. This may change in
          * future JavaMail.  But if there are other Return-Path header
-         * values, let's drop our placeholder. */
+         * values, let's drop our placeholder.
 
         MailHeaders newHeaders = new MailHeaders(new 
ByteArrayInputStream((RFC2822Headers.RETURN_PATH + ": 
placeholder").getBytes()));
         newHeaders.setHeader(RFC2822Headers.RETURN_PATH, null);
         newHeaders.load(is);
         String[] returnPathHeaders = 
newHeaders.getHeader(RFC2822Headers.RETURN_PATH);
         if (returnPathHeaders.length > 1) 
newHeaders.setHeader(RFC2822Headers.RETURN_PATH, returnPathHeaders[1]);
+        */
+        
+        // Keep this: skip the headers from the stream
+        // we could put that code in the else and simple write an "header" 
skipping
+        // reader for the others.
+        MailHeaders newHeaders = new MailHeaders(is);
         
         if (headers != null) {
             return headers;

Modified: 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java
URL: 
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java?rev=423582&r1=423581&r2=423582&view=diff
==============================================================================
--- 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java 
(original)
+++ 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageTest.java 
Wed Jul 19 13:09:29 2006
@@ -29,6 +29,7 @@
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.util.Arrays;
+import java.util.Enumeration;
 import java.util.Properties;
 
 import junit.framework.TestCase;
@@ -55,6 +56,26 @@
             +"test body";
     }
     
+
+    protected MimeMessage getMessageWithBadReturnPath() throws Exception {
+        MimeMessage mmCreated = new MimeMessage(Session.getDefaultInstance(new 
Properties()));
+        mmCreated.setSubject("test");
+        mmCreated.setHeader(RFC2822Headers.RETURN_PATH, "<[EMAIL PROTECTED]>");
+        mmCreated.setText("test body");
+        mmCreated.saveChanges();
+        return mmCreated;
+    }
+    
+    protected String getMessageWithBadReturnPathSource() throws Exception {
+        return "Subject: test\r\n"
+            +"Return-Path: <[EMAIL PROTECTED]>\r\n"
+            +"MIME-Version: 1.0\r\n"
+            +"Content-Type: text/plain; charset=us-ascii\r\n"
+            +"Content-Transfer-Encoding: 7bit\r\n"
+            +"\r\n"
+            +"test body";
+    }
+    
     protected String getSimpleMessageCleanedSourceHeaderExpected() throws 
Exception {
         return "X-Test: foo\r\n"+getSimpleMessageCleanedSource();
     }
@@ -244,10 +265,6 @@
 
         String res = out2.toString();
 
-        // we put a "Return-Path: null" placeholder in MimeMessageWrapper.
-        // if noone write it, we should consider it equals.
-        if (res.startsWith("Return-Path: null")) res = res.substring(19);
-        
         int p = res.indexOf("\r\n\r\n");
         if (p > 0) {
             String head = res.substring(0,p);
@@ -381,5 +398,17 @@
         ContainerUtil.dispose(mmorig);
     }
     
+    public void testReturnPath() throws Exception {
+        MimeMessage message = getSimpleMessage();
+        assertNull(message.getHeader(RFC2822Headers.RETURN_PATH));
+    }
+    
+    public void testHeaderOrder() throws Exception {
+        MimeMessage message = getSimpleMessage();
+        message.setHeader(RFC2822Headers.RETURN_PATH, "<[EMAIL PROTECTED]>");
+        Enumeration h =  message.getAllHeaderLines();
+        
+        assertEquals(h.nextElement(),"Return-Path: <[EMAIL PROTECTED]>");
+    }
 
-}
+}
\ No newline at end of file

Modified: 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageWrapperTest.java
URL: 
http://svn.apache.org/viewvc/james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageWrapperTest.java?rev=423582&r1=423581&r2=423582&view=diff
==============================================================================
--- 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageWrapperTest.java
 (original)
+++ 
james/server/branches/v2.3/src/test/org/apache/james/core/MimeMessageWrapperTest.java
 Wed Jul 19 13:09:29 2006
@@ -17,6 +17,7 @@
 package org.apache.james.core;
 
 import org.apache.avalon.framework.container.ContainerUtil;
+import org.apache.mailet.RFC2822Headers;
 
 import javax.mail.MessagingException;
 import javax.mail.internet.MimeMessage;
@@ -27,6 +28,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
+import java.util.Enumeration;
 
 /**
  * Test the subject folding issue.
@@ -212,6 +214,30 @@
             // TODO Auto-generated catch block
             e.printStackTrace();
         }
+    }
+
+    
+    public void testReplaceReturnPathOnBadMessage() throws Exception {
+        MimeMessage message = getMessageWithBadReturnPath();
+        message.setHeader(RFC2822Headers.RETURN_PATH, "<[EMAIL PROTECTED]>");
+        Enumeration e =  message.getMatchingHeaderLines(new String[] 
{"Return-Path"});
+        assertEquals("Return-Path: <[EMAIL PROTECTED]>",e.nextElement());
+        assertFalse(e.hasMoreElements());
+        Enumeration h =  message.getAllHeaderLines();
+        assertEquals("Return-Path: <[EMAIL PROTECTED]>",h.nextElement());
+        assertFalse(h.nextElement().toString().startsWith("Return-Path:"));
+    }
+    
+    public void testAddReturnPathOnBadMessage() throws Exception {
+        MimeMessage message = getMessageWithBadReturnPath();
+        message.addHeader(RFC2822Headers.RETURN_PATH, "<[EMAIL PROTECTED]>");
+        // test that we have now 2 return-paths
+        Enumeration e = message.getMatchingHeaderLines(new String[] 
{"Return-Path"});
+        assertEquals("Return-Path: <[EMAIL PROTECTED]>",e.nextElement());
+        assertEquals("Return-Path: <[EMAIL PROTECTED]>",e.nextElement());
+        // test that return-path is the first line
+        Enumeration h =  message.getAllHeaderLines();
+        assertEquals("Return-Path: <[EMAIL PROTECTED]>",h.nextElement());
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to