Author: sergeyb Date: Sat Jun 27 20:52:49 2009 New Revision: 789013 URL: http://svn.apache.org/viewvc?rev=789013&view=rev Log: CXF-2322 : applying a patch on behalf of Eamonn Dwyer with minor updates, thanks
Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java?rev=789013&r1=789012&r2=789013&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/AbstractClient.java Sat Jun 27 20:52:49 2009 @@ -297,7 +297,7 @@ currentBuilder = new UriBuilderImpl(uri); } - protected ResponseBuilder setResponseBuilder(HttpURLConnection conn) throws Throwable { + protected ResponseBuilder setResponseBuilder(HttpURLConnection conn, Message inMessage) throws Throwable { if (conn == null) { throw new WebApplicationException(); @@ -321,9 +321,13 @@ } } } + InputStream mStream = null; + if (inMessage != null) { + mStream = inMessage.getContent(InputStream.class); + } if (status >= 400) { try { - InputStream errorStream = conn.getErrorStream(); + InputStream errorStream = mStream == null ? conn.getErrorStream() : mStream; if (errorStream != null) { responseBuilder.entity(IOUtils.readStringFromStream(errorStream)); } @@ -332,7 +336,8 @@ } } else { try { - responseBuilder.entity(conn.getInputStream()); + InputStream stream = mStream == null ? conn.getInputStream() : mStream; + responseBuilder.entity(stream); } catch (Exception ex) { // it may that the successful response has no response body } @@ -551,7 +556,7 @@ protected void setInInterceptors(List<Interceptor> interceptors) { inInterceptors = interceptors; } - + protected void setOutInterceptors(List<Interceptor> interceptors) { outInterceptors = interceptors; } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java?rev=789013&r1=789012&r2=789013&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/ClientProxyImpl.java Sat Jun 27 20:52:49 2009 @@ -392,11 +392,11 @@ } - protected Object handleResponse(HttpURLConnection connect, Message inMessage, OperationResourceInfo ori) + protected Object handleResponse(HttpURLConnection connect, Message outMessage, OperationResourceInfo ori) throws Throwable { - Response r = setResponseBuilder(connect).clone().build(); + Response r = setResponseBuilder(connect, outMessage.getExchange().getInMessage()).clone().build(); Method method = ori.getMethodToInvoke(); - checkResponse(method, r, inMessage); + checkResponse(method, r, outMessage); if (method.getReturnType() == Void.class) { return null; } @@ -406,7 +406,7 @@ return r; } - return readBody(r, connect, inMessage, method.getReturnType(), + return readBody(r, connect, outMessage, method.getReturnType(), method.getGenericReturnType(), method.getDeclaredAnnotations()); } Modified: cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java URL: http://svn.apache.org/viewvc/cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java?rev=789013&r1=789012&r2=789013&view=diff ============================================================================== --- cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java (original) +++ cxf/trunk/rt/frontend/jaxrs/src/main/java/org/apache/cxf/jaxrs/client/WebClient.java Sat Jun 27 20:52:49 2009 @@ -486,12 +486,12 @@ return handleResponse(connect, m, responseClass); } - protected Response handleResponse(HttpURLConnection conn, Message m, Class<?> responseClass) { + protected Response handleResponse(HttpURLConnection conn, Message outMessage, Class<?> responseClass) { try { - ResponseBuilder rb = setResponseBuilder(conn).clone(); + ResponseBuilder rb = setResponseBuilder(conn, outMessage.getExchange().getInMessage()).clone(); Response currentResponse = rb.clone().build(); - Object entity = readBody(currentResponse, conn, m, responseClass, responseClass, + Object entity = readBody(currentResponse, conn, outMessage, responseClass, responseClass, new Annotation[]{}); rb.entity(entity); Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java?rev=789013&r1=789012&r2=789013&view=diff ============================================================================== --- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java (original) +++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/jaxrs/JAXRSSoapBookTest.java Sat Jun 27 20:52:49 2009 @@ -19,6 +19,7 @@ package org.apache.cxf.systest.jaxrs; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.net.URL; @@ -40,13 +41,18 @@ import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.methods.RequestEntity; import org.apache.cxf.helpers.IOUtils; +import org.apache.cxf.interceptor.Fault; import org.apache.cxf.io.CachedOutputStream; import org.apache.cxf.jaxrs.client.JAXRSClientFactory; +import org.apache.cxf.jaxrs.client.JAXRSClientFactoryBean; import org.apache.cxf.jaxrs.client.ResponseExceptionMapper; import org.apache.cxf.jaxrs.client.WebClient; import org.apache.cxf.jaxrs.ext.form.Form; import org.apache.cxf.jaxrs.ext.xml.XMLSource; import org.apache.cxf.jaxrs.impl.MetadataMap; +import org.apache.cxf.message.Message; +import org.apache.cxf.phase.AbstractPhaseInterceptor; +import org.apache.cxf.phase.Phase; import org.apache.cxf.testutil.common.AbstractBusClientServerTestBase; import org.junit.BeforeClass; @@ -160,6 +166,19 @@ } } + @Test + public void testOtherInterceptorDrainingStream() throws Exception { + + String baseAddress = "http://localhost:9092/test/services/rest"; + JAXRSClientFactoryBean bean = new JAXRSClientFactoryBean(); + bean.setAddress(baseAddress); + bean.getInInterceptors().add(new TestStreamDrainInterptor()); + WebClient client = bean.createWebClient(); + client.path("/bookstore/123").accept(MediaType.APPLICATION_XML_TYPE); + Book b = client.get(Book.class); + assertEquals(123, b.getId()); + assertEquals("CXF in Action", b.getName()); + } @Test public void testGetBookSubresourceClient() throws Exception { @@ -408,4 +427,30 @@ } } + + @Ignore + public class TestStreamDrainInterptor extends AbstractPhaseInterceptor<Message> { + public TestStreamDrainInterptor() { + super(Phase.RECEIVE); + } + + public void handleMessage(Message message) throws Fault { + InputStream is = message.getContent(InputStream.class); + if (is == null) { + return; + } + byte[] payload; + try { + // input stream will be closed by readBytesFromStream() + payload = IOUtils.readBytesFromStream(is); + assertTrue("payload was null", payload != null); + assertTrue("payload was EMPTYR", payload.length > 0); + message.setContent(InputStream.class, new ByteArrayInputStream(payload)); + } catch (Exception e) { + String error = "Failed to read the stream properly due to " + e.getMessage(); + assertFalse(error, e != null); + } + } + + } }