Bug 1251044: P1. Use content-range values to determine content's length. r?roc draft
authorJean-Yves Avenard <jyavenard@mozilla.com>
Thu, 25 Feb 2016 16:52:11 +1100
changeset 334495 9812b6f0acf5d101a8ea1d7207d135923aabb0a3
parent 334494 95471e032d564b0db816f2894a68ff915612e476
child 334496 5955db23f2c2b62715af11aa310007d0f4cf7513
push id11553
push userbmo:jyavenard@mozilla.com
push dateThu, 25 Feb 2016 08:46:15 +0000
reviewersroc
bugs1251044
milestone47.0a1
Bug 1251044: P1. Use content-range values to determine content's length. r?roc MozReview-Commit-ID: 7oAmvRGxzw3
dom/media/MediaResource.cpp
--- a/dom/media/MediaResource.cpp
+++ b/dom/media/MediaResource.cpp
@@ -239,20 +239,20 @@ ChannelMediaResource::OnStartRequest(nsI
     if (responseStatus == HTTP_PARTIAL_RESPONSE_CODE) {
       // Parse Content-Range header.
       int64_t rangeStart = 0;
       int64_t rangeEnd = 0;
       int64_t rangeTotal = 0;
       rv = ParseContentRangeHeader(hc, rangeStart, rangeEnd, rangeTotal);
 
       // We received 'Content-Range', so the server accepts range requests.
-      acceptsRanges = NS_SUCCEEDED(rv);
+      bool gotRangeHeader = NS_SUCCEEDED(rv);
 
       if (!mByteRange.IsEmpty()) {
-        if (!acceptsRanges) {
+        if (!gotRangeHeader) {
           // Content-Range header text should be parse-able when processing a
           // range requests.
           CMLOG("Error processing \'Content-Range' for "
                 "HTTP_PARTIAL_RESPONSE_CODE: rv[%x] channel[%p] decoder[%p]",
                 rv, hc.get(), mCallback.get());
           mCallback->NotifyNetworkError();
           CloseChannel();
           return NS_OK;
@@ -270,20 +270,20 @@ ChannelMediaResource::OnStartRequest(nsI
         //       For now, tell the decoder that the stream is infinite.
         if (rangeTotal == -1) {
           boundedSeekLimit = false;
         } else {
           mCacheStream.NotifyDataLength(rangeTotal);
         }
         mCacheStream.NotifyDataStarted(rangeStart);
         mOffset = rangeStart;
-      } else if (contentLength < 0 && acceptsRanges && rangeTotal > 0) {
-        // Content-Length was unknown, use content-range instead.
-        contentLength = rangeTotal;
+      } else if (gotRangeHeader && rangeTotal > 0) {
+        contentLength = std::max(contentLength, rangeTotal);
       }
+      acceptsRanges = gotRangeHeader;
     } else if (((mOffset > 0) || !mByteRange.IsEmpty())
                && (responseStatus == HTTP_OK_CODE)) {
       // If we get an OK response but we were seeking, or requesting a byte
       // range, then we have to assume that seeking doesn't work. We also need
       // to tell the cache that it's getting data for the start of the stream.
       mCacheStream.NotifyDataStarted(0);
       mOffset = 0;