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