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 2013/09/11 19:27:37 UTC
svn commit: r1521946 - in /cxf/branches/2.7.x-fixes: ./
rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
Author: sergeyb
Date: Wed Sep 11 17:27:36 2013
New Revision: 1521946
URL: http://svn.apache.org/r1521946
Log:
Merged revisions 1521943 via svnmerge from
https://svn.apache.org/repos/asf/cxf/trunk
........
r1521943 | sergeyb | 2013-09-11 18:17:55 +0100 (Wed, 11 Sep 2013) | 1 line
[CXF-5135] Resetting buffered streams after a client reader returns an object can have side-effects
........
Modified:
cxf/branches/2.7.x-fixes/ (props changed)
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Merged /cxf/trunk:r1521943
Propchange: cxf/branches/2.7.x-fixes/
------------------------------------------------------------------------------
Binary property 'svnmerge-integrated' - no diff available.
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java?rev=1521946&r1=1521945&r2=1521946&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java Wed Sep 11 17:27:36 2013
@@ -315,20 +315,20 @@ public final class ResponseImpl extends
responseMessage.getExchange().getOutMessage());
if (readers != null) {
try {
+ if (entityBufferred) {
+ InputStream.class.cast(entity).reset();
+ }
+
responseMessage.put(Message.PROTOCOL_HEADERS, this.getMetadata());
lastEntity = JAXRSUtils.readFromMessageBodyReader(readers, cls, t,
anns,
InputStream.class.cast(entity),
mediaType,
responseMessage);
- if (!entityBufferred) {
- if (responseStreamCanBeClosed(cls)) {
- InputStream.class.cast(entity).close();
- entity = null;
- }
- } else {
- InputStream.class.cast(entity).reset();
- }
+ if (!entityBufferred && responseStreamCanBeClosed(cls)) {
+ InputStream.class.cast(entity).close();
+ entity = null;
+ }
return cls.cast(lastEntity);
} catch (Exception ex) {
Modified: cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
URL: http://svn.apache.org/viewvc/cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java?rev=1521946&r1=1521945&r2=1521946&view=diff
==============================================================================
--- cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java (original)
+++ cxf/branches/2.7.x-fixes/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java Wed Sep 11 17:27:36 2013
@@ -30,8 +30,22 @@ import javax.ws.rs.core.NewCookie;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import javax.ws.rs.core.Response.StatusType;
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMResult;
+import org.w3c.dom.Document;
+
+import org.apache.cxf.endpoint.Endpoint;
+import org.apache.cxf.jaxrs.provider.ProviderFactory;
import org.apache.cxf.jaxrs.utils.HttpUtils;
+import org.apache.cxf.message.Exchange;
+import org.apache.cxf.message.ExchangeImpl;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.message.MessageImpl;
+import org.apache.cxf.staxutils.StaxUtils;
+import org.easymock.EasyMock;
import org.junit.Assert;
import org.junit.Test;
@@ -40,6 +54,64 @@ import org.junit.Test;
public class ResponseImplTest extends Assert {
@Test
+ public void testReadBufferedStaxUtils() throws Exception {
+ ResponseImpl r = new ResponseImpl(200);
+ Source responseSource = readResponseSource(r);
+ Document doc = StaxUtils.read(responseSource);
+ assertEquals("Response", doc.getDocumentElement().getLocalName());
+ }
+
+ @Test
+ public void testReadBufferedStaxSource() throws Exception {
+ ResponseImpl r = new ResponseImpl(200);
+ Source responseSource = readResponseSource(r);
+ Transformer trans = TransformerFactory.newInstance().newTransformer();
+ DOMResult res = new DOMResult();
+ trans.transform(responseSource, res);
+ Document doc = (Document)res.getNode();
+ assertEquals("Response", doc.getDocumentElement().getLocalName());
+ }
+
+ private Source readResponseSource(ResponseImpl r) {
+ String content = "<Response "
+ + " xmlns=\"urn:oasis:names:tc:xacml:2.0:context:schema:os\""
+ + " xmlns:ns2=\"urn:oasis:names:tc:xacml:2.0:policy:schema:os\">"
+ + "<Result><Decision>Permit</Decision><Status><StatusCode"
+ + " Value=\"urn:oasis:names:tc:xacml:1.0:status:ok\"/></Status></Result></Response>";
+
+
+ MultivaluedMap<String, Object> headers = new MetadataMap<String, Object>();
+ headers.putSingle("Content-Type", "text/xml");
+ r.addMetadata(headers);
+ r.setEntity(new ByteArrayInputStream(content.getBytes()), null);
+ r.setMessage(createMessage());
+ r.bufferEntity();
+ return r.readEntity(Source.class);
+ }
+
+ private Message createMessage() {
+ ProviderFactory factory = ProviderFactory.getInstance();
+ Message m = new MessageImpl();
+ m.put("org.apache.cxf.http.case_insensitive_queries", false);
+ Exchange e = new ExchangeImpl();
+ m.setExchange(e);
+ e.setInMessage(m);
+ e.setOutMessage(new MessageImpl());
+ Endpoint endpoint = EasyMock.createMock(Endpoint.class);
+ endpoint.getEndpointInfo();
+ EasyMock.expectLastCall().andReturn(null).anyTimes();
+ endpoint.size();
+ EasyMock.expectLastCall().andReturn(0).anyTimes();
+ endpoint.isEmpty();
+ EasyMock.expectLastCall().andReturn(true).anyTimes();
+ endpoint.get(ProviderFactory.class.getName());
+ EasyMock.expectLastCall().andReturn(factory).anyTimes();
+ EasyMock.replay(endpoint);
+ e.put(Endpoint.class, endpoint);
+ return m;
+ }
+
+ @Test
public void testResourceImpl() {
String entity = "bar";
ResponseImpl ri = new ResponseImpl(200, entity);