@@ -40,6 +40,10 @@ function log(aMsg) {
40
40
//#endif
41
41
42
42
var NetworkManager = (function NetworkManagerClosure () {
43
+
44
+ var OK_RESPONSE = 200 ;
45
+ var PARTIAL_CONTENT_RESPONSE = 206 ;
46
+
43
47
function NetworkManager (url , args ) {
44
48
this .url = url ;
45
49
args = args || {};
@@ -160,7 +164,15 @@ var NetworkManager = (function NetworkManagerClosure() {
160
164
return ;
161
165
}
162
166
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 ) {
164
176
if (pendingRequest .onError ) {
165
177
pendingRequest .onError (xhr .status );
166
178
}
@@ -170,18 +182,17 @@ var NetworkManager = (function NetworkManagerClosure() {
170
182
this .loadedRequests [xhrId ] = true ;
171
183
172
184
var chunk = getArrayBuffer (xhr );
173
- if (pendingRequest . expectedStatus === 206 ) {
185
+ if (xhr . status === PARTIAL_CONTENT_RESPONSE ) {
174
186
var rangeHeader = xhr .getResponseHeader ('Content-Range' );
175
187
var matches = /bytes (\d+)-(\d+)\/(\d+ )/.exec (rangeHeader );
176
188
var begin = parseInt (matches [1 ], 10 );
177
- var end = parseInt (matches [2 ], 10 ) + 1 ;
178
189
pendingRequest .onDone ({
179
190
begin : begin ,
180
- end : end ,
181
191
chunk : chunk
182
192
});
183
193
} else {
184
194
pendingRequest .onDone ({
195
+ begin : 0 ,
185
196
chunk : chunk
186
197
});
187
198
}
0 commit comments