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]