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>());
}