Skip to content

Commit

Permalink
Merge pull request #10133 from kevinleedrum/fix-content-length
Browse files Browse the repository at this point in the history
Set returnValues.suggestedLength to Content-Length if integer
  • Loading branch information
timvandermeij authored Oct 8, 2018
2 parents b2e7d0c + 4cf10ac commit f45e46d
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 21 deletions.
24 changes: 13 additions & 11 deletions src/display/network_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,30 +27,32 @@ function validateRangeRequestCapabilities({ getResponseHeader, isHttp,
allowRangeRequests: false,
suggestedLength: undefined,
};
if (disableRange || !isHttp) {
return returnValues;
}
if (getResponseHeader('Accept-Ranges') !== 'bytes') {
return returnValues;
}

let contentEncoding = getResponseHeader('Content-Encoding') || 'identity';
if (contentEncoding !== 'identity') {
return returnValues;
}

let length = parseInt(getResponseHeader('Content-Length'), 10);
if (!Number.isInteger(length)) {
return returnValues;
}

returnValues.suggestedLength = length;

if (length <= 2 * rangeChunkSize) {
// The file size is smaller than the size of two chunks, so it does not
// make any sense to abort the request and retry with a range request.
return returnValues;
}

if (disableRange || !isHttp) {
return returnValues;
}
if (getResponseHeader('Accept-Ranges') !== 'bytes') {
return returnValues;
}

let contentEncoding = getResponseHeader('Content-Encoding') || 'identity';
if (contentEncoding !== 'identity') {
return returnValues;
}

returnValues.allowRangeRequests = true;
return returnValues;
}
Expand Down
44 changes: 34 additions & 10 deletions test/unit/network_utils_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,6 @@ import {

describe('network_utils', function() {
describe('validateRangeRequestCapabilities', function() {
const defaultValues = {
allowRangeRequests: false,
suggestedLength: undefined,
};

it('rejects range chunk sizes that are not larger than zero', function() {
expect(function() {
validateRangeRequestCapabilities({ rangeChunkSize: 0, });
Expand All @@ -38,14 +33,30 @@ describe('network_utils', function() {
expect(validateRangeRequestCapabilities({
disableRange: true,
isHttp: true,
getResponseHeader: (headerName) => {
if (headerName === 'Content-Length') {
return 8;
}
},
rangeChunkSize: 64,
})).toEqual(defaultValues);
})).toEqual({
allowRangeRequests: false,
suggestedLength: 8,
});

expect(validateRangeRequestCapabilities({
disableRange: false,
isHttp: false,
getResponseHeader: (headerName) => {
if (headerName === 'Content-Length') {
return 8;
}
},
rangeChunkSize: 64,
})).toEqual(defaultValues);
})).toEqual({
allowRangeRequests: false,
suggestedLength: 8,
});
});

it('rejects invalid Accept-Ranges header values', function() {
Expand All @@ -55,10 +66,15 @@ describe('network_utils', function() {
getResponseHeader: (headerName) => {
if (headerName === 'Accept-Ranges') {
return 'none';
} else if (headerName === 'Content-Length') {
return 8;
}
},
rangeChunkSize: 64,
})).toEqual(defaultValues);
})).toEqual({
allowRangeRequests: false,
suggestedLength: 8,
});
});

it('rejects invalid Content-Encoding header values', function() {
Expand All @@ -70,10 +86,15 @@ describe('network_utils', function() {
return 'bytes';
} else if (headerName === 'Content-Encoding') {
return 'gzip';
} else if (headerName === 'Content-Length') {
return 8;
}
},
rangeChunkSize: 64,
})).toEqual(defaultValues);
})).toEqual({
allowRangeRequests: false,
suggestedLength: 8,
});
});

it('rejects invalid Content-Length header values', function() {
Expand All @@ -90,7 +111,10 @@ describe('network_utils', function() {
}
},
rangeChunkSize: 64,
})).toEqual(defaultValues);
})).toEqual({
allowRangeRequests: false,
suggestedLength: undefined,
});
});

it('rejects file sizes that are too small for range requests', function() {
Expand Down

0 comments on commit f45e46d

Please sign in to comment.