|
|
@ -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 |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
} |
|
|
|