diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 17664dbe53..89ec97dbc9 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -11,6 +11,8 @@ quality video can be loaded up to the full default buffer duration. * Fix audio selection issue where languages are compared by bit rate ([#6335](https://github.com/google/ExoPlayer/issues/6335)). +* Add `HttpDataSource.getResponseCode` to provide the status code associated + with the most recent HTTP response. ### 2.10.4 ### diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java index ca196b1d2f..0f94698e7a 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSource.java @@ -299,6 +299,13 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource { requestProperties.clear(); } + @Override + public int getResponseCode() { + return responseInfo == null || responseInfo.getHttpStatusCode() <= 0 + ? -1 + : responseInfo.getHttpStatusCode(); + } + @Override public Map> getResponseHeaders() { return responseInfo == null ? Collections.emptyMap() : responseInfo.getAllHeaders(); diff --git a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java index 8eb8bba920..95bd4f71de 100644 --- a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java +++ b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSource.java @@ -133,6 +133,11 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource { return response == null ? null : Uri.parse(response.request().url().toString()); } + @Override + public int getResponseCode() { + return response == null ? -1 : response.code(); + } + @Override public Map> getResponseHeaders() { return response == null ? Collections.emptyMap() : response.headers().toMultimap(); 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 66036b7a84..87f95a32a2 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 @@ -82,6 +82,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou private @Nullable HttpURLConnection connection; private @Nullable InputStream inputStream; private boolean opened; + private int responseCode; private long bytesToSkip; private long bytesToRead; @@ -252,6 +253,11 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou return connection == null ? null : Uri.parse(connection.getURL().toString()); } + @Override + public int getResponseCode() { + return connection == null || responseCode <= 0 ? -1 : responseCode; + } + @Override public Map> getResponseHeaders() { return connection == null ? Collections.emptyMap() : connection.getHeaderFields(); @@ -288,7 +294,6 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou dataSpec, HttpDataSourceException.TYPE_OPEN); } - int responseCode; String responseMessage; try { responseCode = connection.getResponseCode(); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java index 07155ee2bc..97ece840ac 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java @@ -354,6 +354,12 @@ public interface HttpDataSource extends DataSource { */ void clearAllRequestProperties(); + /** + * When the source is open, returns the HTTP response status code associated with the last {@link + * #open} call. Otherwise, returns a negative value. + */ + int getResponseCode(); + @Override Map> getResponseHeaders(); }