diff --git a/core/src/main/java/org/springframework/ws/transport/http/AbstractHttpSendingWebServiceConnection.java b/core/src/main/java/org/springframework/ws/transport/http/AbstractHttpSendingWebServiceConnection.java index 27451199..80059ae3 100644 --- a/core/src/main/java/org/springframework/ws/transport/http/AbstractHttpSendingWebServiceConnection.java +++ b/core/src/main/java/org/springframework/ws/transport/http/AbstractHttpSendingWebServiceConnection.java @@ -16,11 +16,13 @@ package org.springframework.ws.transport.http; +import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Iterator; import java.util.zip.GZIPInputStream; +import org.springframework.util.FileCopyUtils; import org.springframework.ws.transport.AbstractSendingWebServiceConnection; import org.springframework.ws.transport.FaultAwareWebServiceConnection; import org.springframework.ws.transport.WebServiceConnection; @@ -39,8 +41,18 @@ public abstract class AbstractHttpSendingWebServiceConnection extends AbstractSe protected static final int HTTP_STATUS_INTERNAL_ERROR = 500; + /** Buffer used for reading the response, when the content length is invalid. */ + private byte[] responseBuffer; + protected final boolean hasResponse() throws IOException { - return getResponseContentLength() > 0; + long contentLength = getResponseContentLength(); + if (contentLength < 0) { + if (responseBuffer == null) { + responseBuffer = FileCopyUtils.copyToByteArray(getResponseInputStream()); + } + contentLength = responseBuffer.length; + } + return contentLength > 0; } public final boolean hasFault() throws IOException { @@ -48,7 +60,14 @@ public abstract class AbstractHttpSendingWebServiceConnection extends AbstractSe } protected final InputStream getResponseInputStream() throws IOException { - return isGzipResponse() ? new GZIPInputStream(getRawResponseInputStream()) : getRawResponseInputStream(); + InputStream inputStream; + if (responseBuffer != null) { + inputStream = new ByteArrayInputStream(responseBuffer); + } + else { + inputStream = getRawResponseInputStream(); + } + return isGzipResponse() ? new GZIPInputStream(inputStream) : inputStream; } /** Determine whether the given response is a GZIP response. */ diff --git a/core/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderIntegrationTestCase.java b/core/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderIntegrationTestCase.java index b15d4c74..9d5a511c 100644 --- a/core/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderIntegrationTestCase.java +++ b/core/src/test/java/org/springframework/ws/transport/http/AbstractHttpWebServiceMessageSenderIntegrationTestCase.java @@ -89,7 +89,10 @@ public abstract class AbstractHttpWebServiceMessageSenderIntegrationTestCase ext public void testSendAndReceiveCompressed() throws Exception { validateResponse(new CompressedResponseServlet()); + } + public void testSendAndReceiveInvalidContentSize() throws Exception { + validateResponse(new InvalidContentSizeServlet()); } public void testSendAndReceiveFault() throws Exception { @@ -192,6 +195,17 @@ public abstract class AbstractHttpWebServiceMessageSenderIntegrationTestCase ext } } + private static class InvalidContentSizeServlet extends NoResponseServlet { + + protected void createResponse(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("text/xml"); + response.addHeader(RESPONSE_HEADER_NAME, RESPONSE_HEADER_VALUE); + response.setContentLength(-1); + byte[] buffer = RESPONSE.getBytes("UTF-8"); + FileCopyUtils.copy(buffer, response.getOutputStream()); + } + } + private static class CompressedResponseServlet extends NoResponseServlet { protected void createResponse(HttpServletRequest request, HttpServletResponse response) throws IOException {