Skip to content

Commit 3c0705d

Browse files
committed
Merge pull request mozilla#3178 from yurydelendik/issue3156
Cherry-pick of mozilla#3157
2 parents 65a884c + 34eed81 commit 3c0705d

File tree

2 files changed

+17
-5
lines changed

2 files changed

+17
-5
lines changed

src/chunked_stream.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,8 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
363363
var loadedRequests = [];
364364
for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
365365

366-
var requestIds = this.requestsByChunk[chunk];
366+
// The server might return more chunks than requested
367+
var requestIds = this.requestsByChunk[chunk] || [];
367368
delete this.requestsByChunk[chunk];
368369

369370
for (var i = 0; i < requestIds.length; ++i) {

src/network.js

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,10 @@
3636
//#endif
3737

3838
var NetworkManager = (function NetworkManagerClosure() {
39+
40+
var OK_RESPONSE = 200;
41+
var PARTIAL_CONTENT_RESPONSE = 206;
42+
3943
function NetworkManager(url, args) {
4044
this.url = url;
4145
args = args || {};
@@ -156,7 +160,15 @@ var NetworkManager = (function NetworkManagerClosure() {
156160
return;
157161
}
158162

159-
if (xhr.status !== pendingRequest.expectedStatus) {
163+
// From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
164+
// "A server MAY ignore the Range header". This means it's possible to
165+
// get a 200 rather than a 206 response from a range request.
166+
var ok_response_on_range_request =
167+
xhr.status === OK_RESPONSE &&
168+
pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
169+
170+
if (!ok_response_on_range_request &&
171+
xhr.status !== pendingRequest.expectedStatus) {
160172
if (pendingRequest.onError) {
161173
pendingRequest.onError(xhr.status);
162174
}
@@ -166,18 +178,17 @@ var NetworkManager = (function NetworkManagerClosure() {
166178
this.loadedRequests[xhrId] = true;
167179

168180
var chunk = getArrayBuffer(xhr);
169-
if (pendingRequest.expectedStatus === 206) {
181+
if (xhr.status === PARTIAL_CONTENT_RESPONSE) {
170182
var rangeHeader = xhr.getResponseHeader('Content-Range');
171183
var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
172184
var begin = parseInt(matches[1], 10);
173-
var end = parseInt(matches[2], 10) + 1;
174185
pendingRequest.onDone({
175186
begin: begin,
176-
end: end,
177187
chunk: chunk
178188
});
179189
} else {
180190
pendingRequest.onDone({
191+
begin: 0,
181192
chunk: chunk
182193
});
183194
}

0 commit comments

Comments
 (0)