You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by am...@apache.org on 2021/04/16 18:31:46 UTC

[cxf] branch master updated: [CXF-7996] Fix `@Encode` TCK test

This is an automated email from the ASF dual-hosted git repository.

amccright pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cxf.git


The following commit(s) were added to refs/heads/master by this push:
     new 0a3da55  [CXF-7996] Fix `@Encode` TCK test
     new 70133ba  Merge pull request #778 from andymc12/deferDecodingForEncodeTCKtest
0a3da55 is described below

commit 0a3da55265c6bb47757a7ca96a4b4e8235b2dc7b
Author: Andy McCright <j....@gmail.com>
AuthorDate: Tue Apr 13 21:27:22 2021 -0500

    [CXF-7996] Fix `@Encode` TCK test
    
    Signed-off-by: Andy McCright <j....@gmail.com>
---
 .../java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java    | 12 ++++++++++--
 .../src/test/java/org/apache/cxf/jaxrs/Customer.java   |  6 ++++++
 .../org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java     | 18 ++++++++++++++++++
 3 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
index df48754..844a7a1 100644
--- a/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
+++ b/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/utils/JAXRSUtils.java
@@ -1029,15 +1029,15 @@ public final class JAXRSUtils {
         MultivaluedMap<String, String> params =
             (MultivaluedMap<String, String>)m.get(FormUtils.FORM_PARAM_MAP);
 
+        String enc = HttpUtils.getEncoding(mt, StandardCharsets.UTF_8.name());
         if (params == null) {
             params = new MetadataMap<>();
             m.put(FormUtils.FORM_PARAM_MAP, params);
 
             if (mt == null || mt.isCompatible(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) {
                 InputStream entityStream = copyAndGetEntityStream(m);
-                String enc = HttpUtils.getEncoding(mt, StandardCharsets.UTF_8.name());
                 String body = FormUtils.readBody(entityStream, enc);
-                FormUtils.populateMapFromStringOrHttpRequest(params, m, body, enc, decode);
+                FormUtils.populateMapFromStringOrHttpRequest(params, m, body, enc, false);
             } else {
                 if ("multipart".equalsIgnoreCase(mt.getType())
                     && MediaType.MULTIPART_FORM_DATA_TYPE.isCompatible(mt)) {
@@ -1054,6 +1054,14 @@ public final class JAXRSUtils {
             }
         }
 
+        if (decode) {
+            List<String> values = params.get(key);
+            if (values != null) {
+                values = values.stream().map(value -> HttpUtils.urlDecode(value, enc)).collect(Collectors.toList());
+                params.replace(key, values);
+            }
+        }
+
         if ("".equals(key)) {
             return InjectionUtils.handleBean(pClass, paramAnns, params, ParameterType.FORM, m, false);
         }
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
index 10f7e50..d731c29 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/Customer.java
@@ -37,6 +37,7 @@ import javax.ws.rs.BeanParam;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.CookieParam;
 import javax.ws.rs.DefaultValue;
+import javax.ws.rs.Encoded;
 import javax.ws.rs.FormParam;
 import javax.ws.rs.GET;
 import javax.ws.rs.HeaderParam;
@@ -262,6 +263,11 @@ public class Customer extends AbstractCustomer implements CustomerInfo {
     public void testBeanParam(@BeanParam CustomerBean cb) {
 
     }
+
+    public void testEncodedFormParams(@FormParam("p1") String p1, @FormParam("p2") @Encoded String p2) {
+
+    }
+
     public Application getApplication1() {
         return application1;
     }
diff --git a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
index b040edf..b665aeb 100644
--- a/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
+++ b/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/utils/JAXRSUtilsTest.java
@@ -1634,6 +1634,24 @@ public class JAXRSUtilsTest {
         assertEquals("3", list.get(1));
     }
 
+    @Test
+    public void testEncodedFormParameters() throws Exception {
+        Class<?>[] argType = {String.class, String.class};
+        Method m = Customer.class.getMethod("testEncodedFormParams", argType);
+        final Message messageImpl = createMessage();
+        String body = "p1=yay&p2=%21";
+        messageImpl.put(Message.REQUEST_URI, "/foo");
+        messageImpl.put("Content-Type", MediaType.APPLICATION_FORM_URLENCODED);
+        messageImpl.setContent(InputStream.class, new ByteArrayInputStream(body.getBytes()));
+
+        List<Object> params = JAXRSUtils.processParameters(new OperationResourceInfo(m,
+                                                               new ClassResourceInfo(Customer.class)),
+                                                           new MetadataMap<String, String>(), messageImpl);
+        assertEquals("2 params should've been identified", 2, params.size());
+        assertEquals("yay", (String)params.get(0));
+        assertEquals("%21", (String)params.get(1)); // if decoded, this will return "!" instead of "%21"
+    }
+
     private static Map<ClassResourceInfo, MultivaluedMap<String, String>> getMap(ClassResourceInfo cri) {
         return Collections.singletonMap(cri, new MetadataMap<String, String>());
     }