Author: veithen
Date: Tue May 25 20:36:08 2010
New Revision: 948200

URL: http://svn.apache.org/viewvc?rev=948200&view=rev
Log:
When converting from a content ID to a cid URL, limit percent-encoding to what 
is strictly necessary. URLEncoder#encode causes an interop issue with Sun's 
SAAJ implementation.

Added:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java
   (with props)
Modified:
    
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java

Modified: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java?rev=948200&r1=948199&r2=948200&view=diff
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
 (original)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/main/java/org/apache/axiom/util/stax/xop/XOPUtils.java
 Tue May 25 20:36:08 2010
@@ -22,7 +22,6 @@ package org.apache.axiom.util.stax.xop;
 import java.io.IOException;
 import java.io.UnsupportedEncodingException;
 import java.net.URLDecoder;
-import java.net.URLEncoder;
 
 import javax.activation.DataHandler;
 import javax.xml.stream.XMLStreamReader;
@@ -70,17 +69,36 @@ public class XOPUtils {
     
     /**
      * Build a cid URL from the given content ID as described in RFC2392.
+     * <p>
+     * Note that this implementation only encodes the percent character 
(replacing it by "%25"). The
+     * reason is given by the following quotes from RFC3986:
+     * <blockquote>
+     * If a reserved character is
+     * found in a URI component and no delimiting role is known for that 
character, then it must be
+     * interpreted as representing the data octet corresponding to that 
character's encoding in
+     * US-ASCII. [...]
+     * <p>
+     * Under normal circumstances, the only time when octets within a URI are 
percent-encoded is
+     * during the process of producing the URI from its component parts. This 
is when an
+     * implementation determines which of the reserved characters are to be 
used as subcomponent
+     * delimiters and which can be safely used as data. [...]
+     * <p>
+     * Because the percent ("%") character serves as the indicator for 
percent-encoded octets, it
+     * must be percent-encoded as "%25" for that octet to be used as data 
within a URI.
+     * </blockquote>
+     * <p>
+     * Since RFC2392 doesn't define any subcomponents for the cid scheme and 
since RFC2045 specifies
+     * that only US-ASCII characters are allowed in content IDs, the percent 
character (which is
+     * specifically allowed by RFC2045) is the only character that needs URL 
encoding.
+     * <p>
+     * Another reason to strictly limit the set of characters to be encoded is 
that some
+     * applications fail to decode cid URLs correctly if they contain percent 
encoded octets.
      * 
      * @param contentID the content ID (without enclosing angle brackets)
      * @return the corresponding URL in the cid scheme
      */
     public static String getURLForContentID(String contentID) {
-        try {
-            return "cid:" + URLEncoder.encode(contentID, "ascii");
-        } catch (UnsupportedEncodingException ex) {
-            // We should never get here
-            throw new Error(ex);
-        }
+        return "cid:" + contentID.replaceAll("%", "%25");
     }
     
     /**

Added: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java
URL: 
http://svn.apache.org/viewvc/webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java?rev=948200&view=auto
==============================================================================
--- 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java
 (added)
+++ 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java
 Tue May 25 20:36:08 2010
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.axiom.util.stax.xop;
+
+import junit.framework.TestCase;
+
+public class XOPUtilsTest extends TestCase {
+    public void testGetURLForContentID() {
+        // We should not unnecessarily encode characters such as '@', because 
some implementations
+        // don't decode cid URLs correctly
+        assertEquals("cid:[email protected]", 
XOPUtils.getURLForContentID("[email protected]"));
+    }
+
+    public void testGetURLForContentIDWithPercent() {
+        // '%' is the only character that really needs encoding
+        assertEquals("cid:xxx%[email protected]", 
XOPUtils.getURLForContentID("xxx%[email protected]"));
+    }
+}

Propchange: 
webservices/commons/trunk/modules/axiom/modules/axiom-api/src/test/java/org/apache/axiom/util/stax/xop/XOPUtilsTest.java
------------------------------------------------------------------------------
    svn:eol-style = native


Reply via email to