From c02b2cb37c6c82a65b8877b5671122b6c23ae6b7 Mon Sep 17 00:00:00 2001 From: Rob Wu Date: Tue, 30 Dec 2014 16:48:17 +0100 Subject: [PATCH] Use Content-Range instead of Content-Length #5512 Use Content-Range header instead of Content-Length when the response has status code 206, to work around issue #5512, which is caused by a bug in Chrome (since version 39): https://code.google.com/p/chromium/issues/detail?id=442318 --- src/core/worker.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/core/worker.js b/src/core/worker.js index 40d7d899e..2de03204a 100644 --- a/src/core/worker.js +++ b/src/core/worker.js @@ -106,6 +106,22 @@ var WorkerMessageHandler = PDFJS.WorkerMessageHandler = { var length = fullRequestXhr.getResponseHeader('Content-Length'); length = parseInt(length, 10); +//#if (GENERIC || CHROME) + if (fullRequestXhr.status === 206) { + // Since Chrome 39, there exists a bug where cached responses are + // served with status code 206 for non-range requests. + // Content-Length does not specify the total size of the resource + // when the status code is 206 (see RFC 2616, section 14.16). + // In this case, extract the file size from the Content-Range + // header, which is defined to be "bytes start-end/length" for + // byte range requests. + // See https://github.com/mozilla/pdf.js/issues/5512 and + // https://code.google.com/p/chromium/issues/detail?id=442318 + length = fullRequestXhr.getResponseHeader('Content-Range'); + length = length && /bytes \d+-\d+\/(\d+)/.exec(length); + length = length && parseInt(length[1], 10); + } +//#endif if (!isInt(length)) { return; }