diff --git a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java index 9d4f9b6811..f892ca8ab1 100644 --- a/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java +++ b/library/common/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java @@ -306,6 +306,11 @@ public interface HttpDataSource extends DataSource { */ public final Map> headerFields; + /** + * The response body, if one was provided. + */ + @Nullable public final byte[] responseBody; + /** @deprecated Use {@link #InvalidResponseCodeException(int, String, Map, DataSpec)}. */ @Deprecated public InvalidResponseCodeException( @@ -313,15 +318,27 @@ public interface HttpDataSource extends DataSource { this(responseCode, /* responseMessage= */ null, headerFields, dataSpec); } + /** @deprecated Use {@link #InvalidResponseCodeException(int, String, Map, DataSpec byte[])}. */ + @Deprecated public InvalidResponseCodeException( int responseCode, @Nullable String responseMessage, Map> headerFields, DataSpec dataSpec) { + this(responseCode, responseMessage, headerFields, dataSpec, /* responseBody= */ null); + } + + public InvalidResponseCodeException( + int responseCode, + @Nullable String responseMessage, + Map> headerFields, + DataSpec dataSpec, + @Nullable byte[] responseBody) { super("Response code: " + responseCode, dataSpec, TYPE_OPEN); this.responseCode = responseCode; this.responseMessage = responseMessage; this.headerFields = headerFields; + this.responseBody = responseBody; } } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java index f2cf344b9f..00461b543c 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java @@ -284,9 +284,16 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou } String responseMessage; + byte[] errorResponseBody = null; try { responseCode = connection.getResponseCode(); responseMessage = connection.getResponseMessage(); + InputStream errorStream = connection.getErrorStream(); + // Android Studio says errorStream will never be null, but Android docs say otherwise. + // Just check to be sure. + if (errorStream != null) { + errorResponseBody = Util.toByteArray(errorStream); + } } catch (IOException e) { closeConnectionQuietly(); throw new HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e, @@ -298,7 +305,9 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou Map> headers = connection.getHeaderFields(); closeConnectionQuietly(); InvalidResponseCodeException exception = - new InvalidResponseCodeException(responseCode, responseMessage, headers, dataSpec); + new InvalidResponseCodeException(responseCode, responseMessage, headers, dataSpec, + errorResponseBody); + if (responseCode == 416) { exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE)); }