diff --git a/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponse.java b/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponse.java index d5eb7d1727..c42e36deb5 100644 --- a/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponse.java +++ b/scm-webapp/src/main/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponse.java @@ -33,11 +33,13 @@ package sonia.scm.net.ahc; //~--- non-JDK imports -------------------------------------------------------- -import com.google.common.collect.HashMultimap; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; import com.google.common.io.ByteSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + //~--- JDK imports ------------------------------------------------------------ import java.io.IOException; @@ -132,6 +134,14 @@ public class DefaultAdvancedHttpResponse extends AdvancedHttpResponse private static class URLConnectionByteSource extends ByteSource { + /** + * the logger for URLConnectionByteSource + */ + private static final Logger logger = + LoggerFactory.getLogger(URLConnectionByteSource.class); + + //~--- constructors ------------------------------------------------------- + /** * Constructs a new {@link URLConnectionByteSource}. * @@ -146,17 +156,35 @@ public class DefaultAdvancedHttpResponse extends AdvancedHttpResponse //~--- methods ------------------------------------------------------------ /** - * Opens the http connection. + * Opens the input stream of http connection, if an error occurs during + * opening the method will return the error stream instead. * * - * @return http connection + * @return input or error stream of http connection * * @throws IOException */ @Override public InputStream openStream() throws IOException { - return connection.getInputStream(); + InputStream stream; + + try + { + stream = connection.getInputStream(); + } + catch (IOException ex) + { + if (logger.isDebugEnabled()) + { + logger.debug( + "could not open input stream, open error stream instead", ex); + } + + stream = connection.getErrorStream(); + } + + return stream; } //~--- fields ------------------------------------------------------------- diff --git a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java index 470f1d14ae..063b8b6f09 100644 --- a/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java +++ b/scm-webapp/src/test/java/sonia/scm/net/ahc/DefaultAdvancedHttpResponseTest.java @@ -92,6 +92,28 @@ public class DefaultAdvancedHttpResponseTest assertEquals("test", content.asCharSource(Charsets.UTF_8).read()); } + /** + * Method description + * + * + * @throws IOException + */ + @Test + public void testContentAsByteSourceWithFailedRequest() throws IOException + { + ByteArrayInputStream bais = + new ByteArrayInputStream("test".getBytes(Charsets.UTF_8)); + + when(connection.getInputStream()).thenThrow(IOException.class); + when(connection.getErrorStream()).thenReturn(bais); + + AdvancedHttpResponse response = new DefaultAdvancedHttpResponse(connection, + 404, "NOT FOUND"); + ByteSource content = response.contentAsByteSource(); + + assertEquals("test", content.asCharSource(Charsets.UTF_8).read()); + } + /** * Method description *