Bug 1251044: P1. Use content-range values to determine content's length. r?roc
MozReview-Commit-ID: 7oAmvRGxzw3
--- 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;