Skip to content

Commit 1d48e9c

Browse files
committed
Handle server returning 200 for range request
1 parent f93582a commit 1d48e9c

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
@@ -40,6 +40,10 @@ function log(aMsg) {
4040
//#endif
4141

4242
var NetworkManager = (function NetworkManagerClosure() {
43+
44+
var OK_RESPONSE = 200;
45+
var PARTIAL_CONTENT_RESPONSE = 206;
46+
4347
function NetworkManager(url, args) {
4448
this.url = url;
4549
args = args || {};
@@ -160,7 +164,15 @@ var NetworkManager = (function NetworkManagerClosure() {
160164
return;
161165
}
162166

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

172184
var chunk = getArrayBuffer(xhr);
173-
if (pendingRequest.expectedStatus === 206) {
185+
if (xhr.status === PARTIAL_CONTENT_RESPONSE) {
174186
var rangeHeader = xhr.getResponseHeader('Content-Range');
175187
var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
176188
var begin = parseInt(matches[1], 10);
177-
var end = parseInt(matches[2], 10) + 1;
178189
pendingRequest.onDone({
179190
begin: begin,
180-
end: end,
181191
chunk: chunk
182192
});
183193
} else {
184194
pendingRequest.onDone({
195+
begin: 0,
185196
chunk: chunk
186197
});
187198
}

0 commit comments

Comments
 (0)