You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2020/01/10 16:13:22 UTC
[cxf] branch master updated: TCK: Resolves FormParam-related
failures
This is an automated email from the ASF dual-hosted git repository.
dkulp 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 dc71ce1 TCK: Resolves FormParam-related failures
dc71ce1 is described below
commit dc71ce1635330136e472e0b6fb5ce4a71ae0d474
Author: Andy McCright <j....@gmail.com>
AuthorDate: Sat Jan 4 19:48:21 2020 -0600
TCK: Resolves FormParam-related failures
Should fix:
allParamsInParamTest_from_standalone
allParamsOnFieldTest_from_standalone
formParamInParamTest_from_standalone
formParamOnFieldTest_from_standalone
Signed-off-by: Andy McCright <j....@gmail.com>
---
.../org/apache/cxf/jaxrs/utils/JAXRSUtils.java | 43 +++++++++++++++++-----
1 file changed, 34 insertions(+), 9 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 4ed018c..0ce10f6 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
@@ -19,6 +19,8 @@
package org.apache.cxf.jaxrs.utils;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -89,6 +91,7 @@ import org.apache.cxf.common.util.PropertyUtils;
import org.apache.cxf.common.util.ReflectionUtil;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.DOMUtils;
+import org.apache.cxf.helpers.IOUtils;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.io.CacheAndWriteOutputStream;
import org.apache.cxf.io.ReaderInputStream;
@@ -863,14 +866,6 @@ public final class JAXRSUtils {
OperationResourceInfo ori)
throws IOException, WebApplicationException {
- InputStream is = message.getContent(InputStream.class);
- if (is == null) {
- Reader reader = message.getContent(Reader.class);
- if (reader != null) {
- is = new ReaderInputStream(reader);
- }
- }
-
if (parameterClass == AsyncResponse.class) {
return new AsyncResponseImpl(message);
}
@@ -882,6 +877,23 @@ public final class JAXRSUtils {
contentType = defaultCt == null ? MediaType.APPLICATION_OCTET_STREAM : defaultCt;
}
+ MessageContext mc = new MessageContextImpl(message);
+ MediaType mt = mc.getHttpHeaders().getMediaType();
+
+ InputStream is;
+ if (mt == null || mt.isCompatible(MediaType.APPLICATION_FORM_URLENCODED_TYPE)) {
+ is = copyAndGetEntityStream(message);
+ } else {
+ is = message.getContent(InputStream.class);
+ }
+
+ if (is == null) {
+ Reader reader = message.getContent(Reader.class);
+ if (reader != null) {
+ is = new ReaderInputStream(reader);
+ }
+ }
+
return readFromMessageBody(parameterClass,
parameterType,
parameterAnns,
@@ -1018,8 +1030,9 @@ public final class JAXRSUtils {
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(m.getContent(InputStream.class), enc);
+ String body = FormUtils.readBody(entityStream, enc);
FormUtils.populateMapFromStringOrHttpRequest(params, m, body, enc, decode);
} else {
if ("multipart".equalsIgnoreCase(mt.getType())
@@ -1877,4 +1890,16 @@ public final class JAXRSUtils {
return errorMessage;
}
+ // copy the input stream so that it is not inadvertently closed
+ private static InputStream copyAndGetEntityStream(Message m) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ try {
+ IOUtils.copy(m.getContent(InputStream.class), baos);
+ } catch (IOException e) {
+ throw ExceptionUtils.toInternalServerErrorException(e, null);
+ }
+ final byte[] copiedBytes = baos.toByteArray();
+ m.setContent(InputStream.class, new ByteArrayInputStream(copiedBytes));
+ return new ByteArrayInputStream(copiedBytes);
+ }
}