You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by se...@apache.org on 2010/10/03 20:12:52 UTC

svn commit: r1004018 - in /cxf/branches/2.2.x-fixes: ./ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/ rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/ rt/frontend/jaxr...

Author: sergeyb
Date: Sun Oct  3 18:12:52 2010
New Revision: 1004018

URL: http://svn.apache.org/viewvc?rev=1004018&view=rev
Log:
Merged revisions 1004016 via svnmerge from 
https://svn.apache.org/repos/asf/cxf/trunk

........
  r1004016 | sergeyb | 2010-10-03 19:01:56 +0100 (Sun, 03 Oct 2010) | 1 line
  
  Fixing last ignored UriBuilder tests
........

Modified:
    cxf/branches/2.2.x-fixes/   (props changed)
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java
    cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
    svn:mergeinfo = /cxf/trunk:1004016

Propchange: cxf/branches/2.2.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java?rev=1004018&r1=1004017&r2=1004018&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/UriBuilderImpl.java Sun Oct  3 18:12:52 2010
@@ -117,6 +117,13 @@ public class UriBuilderImpl extends UriB
                 && thePath.length() != 0 && !thePath.startsWith("/")) {
                 thePath = "/" + thePath;
             }
+            if (theQuery != null && HttpUtils.isPartiallyEncoded(theQuery)) {
+                try {
+                    return buildURIFromEncoded(thePath, theQuery, theFragment);
+                } catch (Exception ex) {
+                    // lets try the option below
+                }
+            }
             URI uri = new URI(scheme, userInfo, host, port, 
                            thePath, theQuery, theFragment);
             if (thePath.contains("%2F")) {
@@ -585,7 +592,13 @@ public class UriBuilderImpl extends UriB
 
     @Override
     public UriBuilder replaceQuery(String queryValue) throws IllegalArgumentException {
-        query = JAXRSUtils.getStructuredParams(queryValue, "&", true, false);
+        if (queryValue != null) {
+            // workaround to do with a conflicting and confusing requirement where spaces 
+            // passed as part of replaceQuery are encoded as %20 while those passed as part 
+            // of quertyParam are encoded as '+'
+            queryValue = queryValue.replace(" ", "%20");
+        }
+        query = JAXRSUtils.getStructuredParams(queryValue, "&", false, false);
         return this;
     }
 
@@ -656,6 +669,8 @@ public class UriBuilderImpl extends UriB
                 String val = sit.next();
                 if (fromEncoded) {
                     val = HttpUtils.encodePartiallyEncoded(val, isQuery);
+                } else if (isQuery && !val.startsWith("{") && !val.endsWith("}")) { 
+                    val = HttpUtils.encodePartiallyEncoded(val, isQuery);
                 }
                 b.append(entry.getKey());
                 if (val.length() != 0) {

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java?rev=1004018&r1=1004017&r2=1004018&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/HttpUtils.java Sun Oct  3 18:12:52 2010
@@ -61,8 +61,10 @@ public final class HttpUtils {
     private static final String LOCAL_HOST = "localhost";
     private static final Pattern ENCODE_PATTERN = Pattern.compile("%[0-9a-fA-F][0-9a-fA-F]");
     private static final String CHARSET_PARAMETER = "charset";
+    
     // there are more of such characters, ex, '*' but '*' is not affected by UrlEncode
     private static final String PATH_RESERVED_CHARACTERS = "=@";
+    private static final String QUERY_RESERVED_CHARACTERS = "?/+";
     
     private HttpUtils() {
     }
@@ -75,25 +77,14 @@ public final class HttpUtils {
         return UrlUtils.pathDecode(value);
     }
     
-    public static String urlEncode(String value) {
-            
-        try {
-            value = URLEncoder.encode(value, "UTF-8");
-        } catch (UnsupportedEncodingException ex) {
-            // unlikely to happen
-        }
-        
-        return value;
-    }
-    
-    public static String pathEncode(String value) {
+    private static String componentEncode(String reservedChars, String value) {
         
         StringBuilder buffer = new StringBuilder();
         StringBuilder bufferToEncode = new StringBuilder();
         
         for (int i = 0; i < value.length(); i++) {
             char currentChar = value.charAt(i);
-            if (PATH_RESERVED_CHARACTERS.indexOf(currentChar) != -1) {
+            if (reservedChars.indexOf(currentChar) != -1) {
                 if (bufferToEncode.length() > 0) {
                     buffer.append(urlEncode(bufferToEncode.toString()));
                     bufferToEncode.setLength(0);
@@ -108,7 +99,28 @@ public final class HttpUtils {
             buffer.append(urlEncode(bufferToEncode.toString()));
         }
         
-        String result = buffer.toString();
+        return buffer.toString();
+    }
+    
+    public static String queryEncode(String value) {
+        
+        return componentEncode(QUERY_RESERVED_CHARACTERS, value);
+    }
+    
+    public static String urlEncode(String value) {
+        
+        try {
+            value = URLEncoder.encode(value, "UTF-8");
+        } catch (UnsupportedEncodingException ex) {
+            // unlikely to happen
+        }
+        
+        return value;
+    }
+    
+    public static String pathEncode(String value) {
+        
+        String result = componentEncode(PATH_RESERVED_CHARACTERS, value);
         // URLEncoder will encode '+' to %2B but will turn ' ' into '+'
         // We need to retain '+' and encode ' ' as %20
         if (result.indexOf('+') != -1) {
@@ -121,6 +133,9 @@ public final class HttpUtils {
         return result;
     }
     
+    public static boolean isPartiallyEncoded(String value) {
+        return ENCODE_PATTERN.matcher(value).find();
+    }
        
     /**
      * Encodes partially encoded string. Encode all values but those matching pattern 
@@ -138,12 +153,12 @@ public final class HttpUtils {
         int i = 0;
         while (m.find()) {
             String before = encoded.substring(i, m.start());
-            sb.append(query ? HttpUtils.urlEncode(before) : HttpUtils.pathEncode(before));
+            sb.append(query ? HttpUtils.queryEncode(before) : HttpUtils.pathEncode(before));
             sb.append(m.group());
             i = m.end();            
         }
         String tail = encoded.substring(i, encoded.length());
-        sb.append(query ? HttpUtils.urlEncode(tail) : HttpUtils.pathEncode(tail));
+        sb.append(query ? HttpUtils.queryEncode(tail) : HttpUtils.pathEncode(tail));
         return sb.toString();
     }
     

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java?rev=1004018&r1=1004017&r2=1004018&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/client/WebClientTest.java Sun Oct  3 18:12:52 2010
@@ -34,7 +34,7 @@ public class WebClientTest extends Asser
     public void testEncoding() {
         URI u = WebClient.create("http://foo").path("bar+ %2B").matrix("a", "value+ ")
             .query("b", "bv+ ").getCurrentURI();
-        assertEquals("http://foo/bar+%20%2B;a=value+%20?b=bv%2B+", u.toString());
+        assertEquals("http://foo/bar+%20%2B;a=value+%20?b=bv++", u.toString());
     }
     
     @Test

Modified: cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java?rev=1004018&r1=1004017&r2=1004018&view=diff
==============================================================================
--- cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java (original)
+++ cxf/branches/2.2.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/UriBuilderImplTest.java Sun Oct  3 18:12:52 2010
@@ -34,7 +34,6 @@ import org.apache.cxf.jaxrs.resources.Ur
 import org.apache.cxf.jaxrs.utils.JAXRSUtils;
 
 import org.junit.Assert;
-import org.junit.Ignore;
 import org.junit.Test;
 
 public class UriBuilderImplTest extends Assert {
@@ -168,7 +167,7 @@ public class UriBuilderImplTest extends 
             .matrixParam("m", "m1 ", "m2+%20")
             .queryParam("q", "q1 ", "q2+q3%20").clone().buildFromEncoded("a+ ", "b%2B%20 ");   
         assertEquals("URI is not built correctly", 
-                     "http://bar/a+%20/b%2B%20%20;m=m1%20;m=m2+%20?q=q1+&q=q2%2Bq3%20", 
+                     "http://bar/a+%20/b%2B%20%20;m=m1%20;m=m2+%20?q=q1+&q=q2+q3%20", 
                      newUri.toString());
     }
     
@@ -177,7 +176,7 @@ public class UriBuilderImplTest extends 
         URI uri = new URI("http://bar/foo+%20%2B?q=a+b%20%2B");
         URI newUri = new UriBuilderImpl(uri).buildFromEncoded();   
         assertEquals("URI is not built correctly", 
-                     "http://bar/foo+%20%2B?q=a%2Bb%20%2B", newUri.toString());
+                     "http://bar/foo+%20%2B?q=a+b%20%2B", newUri.toString());
     }
     
     @Test
@@ -216,7 +215,7 @@ public class UriBuilderImplTest extends 
     public void testEncodedAddedQuery() throws Exception {
         URI uri = new URI("http://bar");
         URI newUri = new UriBuilderImpl(uri).queryParam("q", "a+b%20%2B").buildFromEncoded();   
-        assertEquals("URI is not built correctly", "http://bar?q=a%2Bb%20%2B", newUri.toString());
+        assertEquals("URI is not built correctly", "http://bar?q=a+b%20%2B", newUri.toString());
     }
     
     @Test
@@ -1091,7 +1090,6 @@ public class UriBuilderImplTest extends 
     }
     
     @Test
-    @Ignore("QueryParamTest5")
     public void testEncodingQueryParamFromBuild() throws Exception {
         String expectedValue =
                 "http://localhost:8080?name=x%3D&name=y?&name=x+y&name=%26";
@@ -1101,7 +1099,6 @@ public class UriBuilderImplTest extends 
     }
     
     @Test
-    @Ignore("ReplaceQueryParamTest3")
     public void testReplaceParamAndEncodeQueryParamFromBuild() throws Exception {
         String expectedValue =
                 "http://localhost:8080?name=x&name=y&name=y+x&name=x%25y&name=%20";
@@ -1112,7 +1109,6 @@ public class UriBuilderImplTest extends 
     }
 
     @Test
-    // ReplaceQuery3
     public void testReplaceStringAndEncodeQueryParamFromBuild() {
         String expected = "http://localhost:8080?name1=x&name2=%20&name3=x+y&name4=23&name5=x%20y";