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 db980aa72b..5e771e8949 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 @@ -32,6 +32,7 @@ import java.io.IOException; import java.net.SocketTimeoutException; import java.net.UnknownHostException; import java.nio.ByteBuffer; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -247,7 +248,7 @@ public class CronetDataSource extends UrlRequest.Callback implements HttpDataSou @Override public Map> getResponseHeaders() { - return responseInfo == null ? null : responseInfo.getAllHeaders(); + return responseInfo == null ? Collections.emptyMap() : responseInfo.getAllHeaders(); } @Override 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 f2898005c1..bc0c2e9047 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 @@ -30,6 +30,7 @@ import java.io.EOFException; import java.io.IOException; import java.io.InputStream; import java.io.InterruptedIOException; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -131,7 +132,7 @@ public class OkHttpDataSource implements HttpDataSource { @Override public Map> getResponseHeaders() { - return response == null ? null : response.headers().toMultimap(); + return response == null ? Collections.emptyMap() : response.headers().toMultimap(); } @Override diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java index ce3230fa43..835ced3f0f 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DataSource.java @@ -19,6 +19,9 @@ import android.net.Uri; import android.support.annotation.Nullable; import com.google.android.exoplayer2.C; import java.io.IOException; +import java.util.Collections; +import java.util.List; +import java.util.Map; /** * A component from which streams of data can be read. @@ -82,6 +85,14 @@ public interface DataSource { */ @Nullable Uri getUri(); + /** + * When the source is open, returns the response headers associated with the last {@link #open} + * call. Otherwise, returns an empty map. + */ + default Map> getResponseHeaders() { + return Collections.emptyMap(); + } + /** * Closes the source. *

diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java index b5469db72e..8550eedc62 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/DefaultDataSource.java @@ -21,6 +21,8 @@ import android.util.Log; import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.io.IOException; +import java.util.List; +import java.util.Map; /** * A {@link DataSource} that supports multiple URI schemes. The supported schemes are: @@ -157,6 +159,13 @@ public final class DefaultDataSource implements DataSource { return dataSource == null ? null : dataSource.getUri(); } + @Override + public Map> getResponseHeaders() { + return dataSource == null + ? DataSource.super.getResponseHeaders() + : dataSource.getResponseHeaders(); + } + @Override public void close() throws IOException { if (dataSource != null) { 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 a47a5b5348..1d545e24e3 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 @@ -32,6 +32,7 @@ import java.net.HttpURLConnection; import java.net.NoRouteToHostException; import java.net.ProtocolException; import java.net.URL; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; @@ -162,7 +163,7 @@ public class DefaultHttpDataSource implements HttpDataSource { @Override public Map> getResponseHeaders() { - return connection == null ? null : connection.getHeaderFields(); + return connection == null ? Collections.emptyMap() : connection.getHeaderFields(); } @Override 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 3725fc0052..71a0e68260 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 @@ -341,10 +341,6 @@ public interface HttpDataSource extends DataSource { */ void clearAllRequestProperties(); - /** - * Returns the headers provided in the response, or {@code null} if response headers are - * unavailable. - */ + @Override Map> getResponseHeaders(); - } diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java index 4cdca49596..ceef14ff94 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/cache/CacheDataSource.java @@ -31,6 +31,8 @@ import java.io.IOException; import java.io.InterruptedIOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.List; +import java.util.Map; /** * A {@link DataSource} that reads and writes a {@link Cache}. Requests are fulfilled from the cache @@ -332,6 +334,14 @@ public final class CacheDataSource implements DataSource { return actualUri; } + @Override + public Map> getResponseHeaders() { + // TODO: Implement. + return isReadingFromUpstream() + ? upstreamDataSource.getResponseHeaders() + : DataSource.super.getResponseHeaders(); + } + @Override public void close() throws IOException { uri = null; diff --git a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java index 26ac3b38fa..2de25b1749 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/upstream/crypto/AesCipherDataSource.java @@ -20,6 +20,8 @@ import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DataSpec; import java.io.IOException; +import java.util.List; +import java.util.Map; import javax.crypto.Cipher; /** @@ -59,15 +61,19 @@ public final class AesCipherDataSource implements DataSource { return read; } - @Override - public void close() throws IOException { - cipher = null; - upstream.close(); - } - @Override public Uri getUri() { return upstream.getUri(); } + @Override + public Map> getResponseHeaders() { + return upstream.getResponseHeaders(); + } + + @Override + public void close() throws IOException { + cipher = null; + upstream.close(); + } } diff --git a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/Aes128DataSource.java b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/Aes128DataSource.java index 3f57cba1b0..59f6839987 100644 --- a/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/Aes128DataSource.java +++ b/library/hls/src/main/java/com/google/android/exoplayer2/source/hls/Aes128DataSource.java @@ -27,6 +27,8 @@ import java.security.InvalidKeyException; import java.security.Key; import java.security.NoSuchAlgorithmException; import java.security.spec.AlgorithmParameterSpec; +import java.util.List; +import java.util.Map; import javax.crypto.Cipher; import javax.crypto.CipherInputStream; import javax.crypto.NoSuchPaddingException; @@ -85,14 +87,6 @@ import javax.crypto.spec.SecretKeySpec; return C.LENGTH_UNSET; } - @Override - public void close() throws IOException { - if (cipherInputStream != null) { - cipherInputStream = null; - upstream.close(); - } - } - @Override public int read(byte[] buffer, int offset, int readLength) throws IOException { Assertions.checkState(cipherInputStream != null); @@ -108,4 +102,16 @@ import javax.crypto.spec.SecretKeySpec; return upstream.getUri(); } + @Override + public Map> getResponseHeaders() { + return upstream.getResponseHeaders(); + } + + @Override + public void close() throws IOException { + if (cipherInputStream != null) { + cipherInputStream = null; + upstream.close(); + } + } }