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:17:56 UTC

svn commit: r1521943 - in /cxf/trunk/rt/frontend/jaxrs/src: main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java

Author: sergeyb
Date: Wed Sep 11 17:17:55 2013
New Revision: 1521943

URL: http://svn.apache.org/r1521943
Log:
[CXF-5135] Resetting buffered streams after a client reader returns an object can have side-effects

Modified:
    cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
    cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java

Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java?rev=1521943&r1=1521942&r2=1521943&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/impl/ResponseImpl.java Wed Sep 11 17:17:55 2013
@@ -344,20 +344,20 @@ public final class ResponseImpl extends 
                                                     null);
             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/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java?rev=1521943&r1=1521942&r2=1521943&view=diff
==============================================================================
--- cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java (original)
+++ cxf/trunk/rt/frontend/jaxrs/src/test/java/org/apache/cxf/jaxrs/impl/ResponseImplTest.java Wed Sep 11 17:17:55 2013
@@ -42,9 +42,24 @@ import javax.ws.rs.core.Variant;
 import javax.ws.rs.core.Variant.VariantListBuilder;
 import javax.ws.rs.ext.RuntimeDelegate;
 import javax.ws.rs.ext.RuntimeDelegate.HeaderDelegate;
-
+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.provider.ServerProviderFactory;
 import org.apache.cxf.jaxrs.resources.Book;
 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;
@@ -53,6 +68,66 @@ 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 = ServerProviderFactory.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.get(Application.class.getName());
+        EasyMock.expectLastCall().andReturn(null);
+        endpoint.size();
+        EasyMock.expectLastCall().andReturn(0).anyTimes();
+        endpoint.isEmpty();
+        EasyMock.expectLastCall().andReturn(true).anyTimes();
+        endpoint.get(ServerProviderFactory.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);
@@ -273,21 +348,6 @@ public class ResponseImplTest extends As
     }
     
     @Test
-    public void testGetLinksSameRel() {
-        ResponseImpl ri = new ResponseImpl(200);
-        MetadataMap<String, Object> meta = new MetadataMap<String, Object>();
-        ri.addMetadata(meta);
-        
-        meta.add(HttpHeaders.LINK, "<http://link1>");
-        meta.add(HttpHeaders.LINK, "<http://link2>");
-        
-        Set<Link> links = ri.getLinks();
-        assertEquals(2, links.size());
-        assertTrue(links.contains(Link.valueOf("<http://link1>")));
-        assertTrue(links.contains(Link.valueOf("<http://link2>")));
-    }
-    
-    @Test
     public void testGetLinks() {
         ResponseImpl ri = new ResponseImpl(200);
         MetadataMap<String, Object> meta = new MetadataMap<String, Object>();