From 9d48d4e4865a98282300194afc995d9783109067 Mon Sep 17 00:00:00 2001 From: olly Date: Thu, 5 Jan 2017 13:40:23 -0800 Subject: [PATCH] Support setting default headers on HttpDataSource.Factory's Issue: #2166 ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=143703258 --- .../ext/cronet/CronetDataSourceFactory.java | 5 +- .../ext/okhttp/OkHttpDataSourceFactory.java | 5 +- .../DefaultHttpDataSourceFactory.java | 6 +- .../exoplayer2/upstream/HttpDataSource.java | 82 +++++++++++++++++++ 4 files changed, 92 insertions(+), 6 deletions(-) diff --git a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java index 0f94dad1584..3df901ce595 100644 --- a/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java +++ b/extensions/cronet/src/main/java/com/google/android/exoplayer2/ext/cronet/CronetDataSourceFactory.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.ext.cronet; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory; import com.google.android.exoplayer2.upstream.HttpDataSource.Factory; import com.google.android.exoplayer2.upstream.TransferListener; import com.google.android.exoplayer2.util.Predicate; @@ -25,7 +26,7 @@ /** * A {@link Factory} that produces {@link CronetDataSource}. */ -public final class CronetDataSourceFactory implements Factory { +public final class CronetDataSourceFactory extends BaseFactory { /** * The default connection timeout, in milliseconds. @@ -67,7 +68,7 @@ public CronetDataSourceFactory(CronetEngine cronetEngine, } @Override - public CronetDataSource createDataSource() { + protected CronetDataSource createDataSourceInternal() { return new CronetDataSource(cronetEngine, executor, contentTypePredicate, transferListener, connectTimeoutMs, readTimeoutMs, resetTimeoutOnRedirects); } diff --git a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.java b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.java index 33f204a6f37..8cbe295fa40 100644 --- a/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.java +++ b/extensions/okhttp/src/main/java/com/google/android/exoplayer2/ext/okhttp/OkHttpDataSourceFactory.java @@ -16,6 +16,7 @@ package com.google.android.exoplayer2.ext.okhttp; import com.google.android.exoplayer2.upstream.DataSource; +import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory; import com.google.android.exoplayer2.upstream.HttpDataSource.Factory; import com.google.android.exoplayer2.upstream.TransferListener; import okhttp3.CacheControl; @@ -24,7 +25,7 @@ /** * A {@link Factory} that produces {@link OkHttpDataSource}. */ -public final class OkHttpDataSourceFactory implements Factory { +public final class OkHttpDataSourceFactory extends BaseFactory { private final Call.Factory callFactory; private final String userAgent; @@ -58,7 +59,7 @@ public OkHttpDataSourceFactory(Call.Factory callFactory, String userAgent, } @Override - public OkHttpDataSource createDataSource() { + protected OkHttpDataSource createDataSourceInternal() { return new OkHttpDataSource(callFactory, userAgent, null, listener, cacheControl); } diff --git a/library/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java b/library/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java index dcfed591453..615eb4df975 100644 --- a/library/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java +++ b/library/src/main/java/com/google/android/exoplayer2/upstream/DefaultHttpDataSourceFactory.java @@ -15,10 +15,11 @@ */ package com.google.android.exoplayer2.upstream; +import com.google.android.exoplayer2.upstream.HttpDataSource.BaseFactory; import com.google.android.exoplayer2.upstream.HttpDataSource.Factory; /** A {@link Factory} that produces {@link DefaultHttpDataSource} instances. */ -public final class DefaultHttpDataSourceFactory implements Factory { +public final class DefaultHttpDataSourceFactory extends BaseFactory { private final String userAgent; private final TransferListener listener; @@ -75,8 +76,9 @@ public DefaultHttpDataSourceFactory(String userAgent, } @Override - public DefaultHttpDataSource createDataSource() { + protected DefaultHttpDataSource createDataSourceInternal() { return new DefaultHttpDataSource(userAgent, null, listener, connectTimeoutMillis, readTimeoutMillis, allowCrossProtocolRedirects); } + } diff --git a/library/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java b/library/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java index f915ee4e24c..8df8624102c 100644 --- a/library/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java +++ b/library/src/main/java/com/google/android/exoplayer2/upstream/HttpDataSource.java @@ -17,11 +17,13 @@ import android.support.annotation.IntDef; import android.text.TextUtils; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Predicate; import com.google.android.exoplayer2.util.Util; import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -38,6 +40,86 @@ interface Factory extends DataSource.Factory { @Override HttpDataSource createDataSource(); + /** + * Sets a default request header field for {@link HttpDataSource} instances subsequently + * created by the factory. Previously created instances are not affected. + * + * @param name The name of the header field. + * @param value The value of the field. + */ + void setDefaultRequestProperty(String name, String value); + + /** + * Clears a default request header field for {@link HttpDataSource} instances subsequently + * created by the factory. Previously created instances are not affected. + * + * @param name The name of the header field. + */ + void clearDefaultRequestProperty(String name); + + /** + * Clears all default request header fields for all {@link HttpDataSource} instances + * subsequently created by the factory. Previously created instances are not affected. + */ + void clearAllDefaultRequestProperties(); + + } + + /** + * Base implementation of {@link Factory} that sets default request properties. + */ + abstract class BaseFactory implements Factory { + + private final HashMap requestProperties; + + public BaseFactory() { + requestProperties = new HashMap<>(); + } + + @Override + public final HttpDataSource createDataSource() { + HttpDataSource dataSource = createDataSourceInternal(); + synchronized (requestProperties) { + for (Map.Entry property : requestProperties.entrySet()) { + dataSource.setRequestProperty(property.getKey(), property.getValue()); + } + } + return dataSource; + } + + @Override + public final void setDefaultRequestProperty(String name, String value) { + Assertions.checkNotNull(name); + Assertions.checkNotNull(value); + synchronized (requestProperties) { + requestProperties.put(name, value); + } + } + + @Override + public final void clearDefaultRequestProperty(String name) { + Assertions.checkNotNull(name); + synchronized (requestProperties) { + requestProperties.remove(name); + } + } + + @Override + public final void clearAllDefaultRequestProperties() { + synchronized (requestProperties) { + requestProperties.clear(); + } + } + + /** + * Called by {@link #createDataSource()} to create a {@link HttpDataSource} instance without + * default request properties set. Default request properties will be set by + * {@link #createDataSource()} before the instance is returned. + * + * @return A {@link HttpDataSource} instance without default request properties set. + */ + protected abstract HttpDataSource createDataSourceInternal(); + } /**