Browse Source

Handle server returning 200 for range request

Mack Duan 12 years ago
parent
commit
1d48e9c201
  1. 3
      src/chunked_stream.js
  2. 19
      src/network.js

3
src/chunked_stream.js

@ -363,7 +363,8 @@ var ChunkedStreamManager = (function ChunkedStreamManagerClosure() {
var loadedRequests = []; var loadedRequests = [];
for (var chunk = beginChunk; chunk < endChunk; ++chunk) { for (var chunk = beginChunk; chunk < endChunk; ++chunk) {
var requestIds = this.requestsByChunk[chunk]; // The server might return more chunks than requested
var requestIds = this.requestsByChunk[chunk] || [];
delete this.requestsByChunk[chunk]; delete this.requestsByChunk[chunk];
for (var i = 0; i < requestIds.length; ++i) { for (var i = 0; i < requestIds.length; ++i) {

19
src/network.js

@ -40,6 +40,10 @@ function log(aMsg) {
//#endif //#endif
var NetworkManager = (function NetworkManagerClosure() { var NetworkManager = (function NetworkManagerClosure() {
var OK_RESPONSE = 200;
var PARTIAL_CONTENT_RESPONSE = 206;
function NetworkManager(url, args) { function NetworkManager(url, args) {
this.url = url; this.url = url;
args = args || {}; args = args || {};
@ -160,7 +164,15 @@ var NetworkManager = (function NetworkManagerClosure() {
return; return;
} }
if (xhr.status !== pendingRequest.expectedStatus) { // From http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.2:
// "A server MAY ignore the Range header". This means it's possible to
// get a 200 rather than a 206 response from a range request.
var ok_response_on_range_request =
xhr.status === OK_RESPONSE &&
pendingRequest.expectedStatus === PARTIAL_CONTENT_RESPONSE;
if (!ok_response_on_range_request &&
xhr.status !== pendingRequest.expectedStatus) {
if (pendingRequest.onError) { if (pendingRequest.onError) {
pendingRequest.onError(xhr.status); pendingRequest.onError(xhr.status);
} }
@ -170,18 +182,17 @@ var NetworkManager = (function NetworkManagerClosure() {
this.loadedRequests[xhrId] = true; this.loadedRequests[xhrId] = true;
var chunk = getArrayBuffer(xhr); var chunk = getArrayBuffer(xhr);
if (pendingRequest.expectedStatus === 206) { if (xhr.status === PARTIAL_CONTENT_RESPONSE) {
var rangeHeader = xhr.getResponseHeader('Content-Range'); var rangeHeader = xhr.getResponseHeader('Content-Range');
var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader); var matches = /bytes (\d+)-(\d+)\/(\d+)/.exec(rangeHeader);
var begin = parseInt(matches[1], 10); var begin = parseInt(matches[1], 10);
var end = parseInt(matches[2], 10) + 1;
pendingRequest.onDone({ pendingRequest.onDone({
begin: begin, begin: begin,
end: end,
chunk: chunk chunk: chunk
}); });
} else { } else {
pendingRequest.onDone({ pendingRequest.onDone({
begin: 0,
chunk: chunk chunk: chunk
}); });
} }

Loading…
Cancel
Save