From 5ffb4d8f55b5973de0c436b81ba8d012c6975e86 Mon Sep 17 00:00:00 2001 From: pfxing Date: Tue, 15 May 2018 18:54:40 -0700 Subject: [PATCH] Rollback set content length and redirect URI ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=196765970 --- .../upstream/cache/CacheDataSource.java | 70 ++++++++++++------- 1 file changed, 44 insertions(+), 26 deletions(-) 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 045fc25338..023567e7df 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 @@ -18,6 +18,7 @@ package com.google.android.exoplayer2.upstream.cache; import android.net.Uri; import android.support.annotation.IntDef; import android.support.annotation.Nullable; +import android.util.Log; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.upstream.DataSink; import com.google.android.exoplayer2.upstream.DataSource; @@ -51,6 +52,8 @@ public final class CacheDataSource implements DataSource { */ public static final long DEFAULT_MAX_CACHE_FILE_SIZE = 2 * 1024 * 1024; + private static final String TAG = "CacheDataSource"; + /** * Flags controlling the cache's behavior. */ @@ -218,7 +221,7 @@ public final class CacheDataSource implements DataSource { try { key = CacheUtil.getKey(dataSpec); uri = dataSpec.uri; - actualUri = getRedirectedUriOrDefault(cache, key, /* defaultUri= */ uri); + actualUri = loadRedirectedUriOrReturnGivenUri(cache, key, uri); flags = dataSpec.flags; readPosition = dataSpec.position; @@ -269,7 +272,7 @@ public final class CacheDataSource implements DataSource { bytesRemaining -= bytesRead; } } else if (currentDataSpecLengthUnset) { - setNoBytesRemainingAndMaybeStoreLength(); + setBytesRemainingAndMaybeStoreLength(0); } else if (bytesRemaining > 0 || bytesRemaining == C.LENGTH_UNSET) { closeCurrentSource(); openNextSource(false); @@ -278,7 +281,7 @@ public final class CacheDataSource implements DataSource { return bytesRead; } catch (IOException e) { if (currentDataSpecLengthUnset && isCausedByPositionOutOfRange(e)) { - setNoBytesRemainingAndMaybeStoreLength(); + setBytesRemainingAndMaybeStoreLength(0); return C.RESULT_END_OF_INPUT; } handleBeforeThrow(e); @@ -399,38 +402,46 @@ public final class CacheDataSource implements DataSource { currentDataSource = nextDataSource; currentDataSpecLengthUnset = nextDataSpec.length == C.LENGTH_UNSET; long resolvedLength = nextDataSource.open(nextDataSpec); - - // Update bytesRemaining, actualUri and (if writing to cache) the cache metadata. - ContentMetadataMutations mutations = new ContentMetadataMutations(); if (currentDataSpecLengthUnset && resolvedLength != C.LENGTH_UNSET) { - bytesRemaining = resolvedLength; - ContentMetadataInternal.setContentLength(mutations, readPosition + bytesRemaining); + setBytesRemainingAndMaybeStoreLength(resolvedLength); } - if (isReadingFromUpstream()) { - actualUri = currentDataSource.getUri(); - boolean isRedirected = !uri.equals(actualUri); - if (isRedirected) { - ContentMetadataInternal.setRedirectedUri(mutations, actualUri); - } else { - ContentMetadataInternal.removeRedirectedUri(mutations); - } + // TODO find a way to store length and redirected uri in one metadata mutation. + maybeUpdateActualUriFieldAndRedirectedUriMetadata(); + } + + private void maybeUpdateActualUriFieldAndRedirectedUriMetadata() { + if (!isReadingFromUpstream()) { + return; } - if (isWritingToCache()) { + actualUri = currentDataSource.getUri(); + maybeUpdateRedirectedUriMetadata(); + } + + private void maybeUpdateRedirectedUriMetadata() { + if (!isWritingToCache()) { + return; + } + ContentMetadataMutations mutations = new ContentMetadataMutations(); + boolean isRedirected = !uri.equals(actualUri); + if (isRedirected) { + ContentMetadataInternal.setRedirectedUri(mutations, actualUri); + } else { + ContentMetadataInternal.removeRedirectedUri(mutations); + } + try { cache.applyContentMetadataMutations(key, mutations); + } catch (CacheException e) { + String message = + "Couldn't update redirected URI. " + + "This might cause relative URIs get resolved incorrectly."; + Log.w(TAG, message, e); } } - private void setNoBytesRemainingAndMaybeStoreLength() throws IOException { - bytesRemaining = 0; - if (isWritingToCache()) { - cache.setContentLength(key, readPosition); - } - } - - private static Uri getRedirectedUriOrDefault(Cache cache, String key, Uri defaultUri) { + private static Uri loadRedirectedUriOrReturnGivenUri(Cache cache, String key, Uri uri) { ContentMetadata contentMetadata = cache.getContentMetadata(key); Uri redirectedUri = ContentMetadataInternal.getRedirectedUri(contentMetadata); - return redirectedUri == null ? defaultUri : redirectedUri; + return redirectedUri == null ? uri : redirectedUri; } private static boolean isCausedByPositionOutOfRange(IOException e) { @@ -447,6 +458,13 @@ public final class CacheDataSource implements DataSource { return false; } + private void setBytesRemainingAndMaybeStoreLength(long bytesRemaining) throws IOException { + this.bytesRemaining = bytesRemaining; + if (isWritingToCache()) { + cache.setContentLength(key, readPosition + bytesRemaining); + } + } + private boolean isReadingFromUpstream() { return !isReadingFromCache(); }