diff --git a/src/display/fetch_stream.js b/src/display/fetch_stream.js index aa139612e..479225d4f 100644 --- a/src/display/fetch_stream.js +++ b/src/display/fetch_stream.js @@ -13,7 +13,9 @@ * limitations under the License. */ -import { assert, createPromiseCapability } from '../shared/util'; +import { + AbortException, assert, createPromiseCapability +} from '../shared/util'; import { createResponseStatusError, validateRangeRequestCapabilities, validateResponseStatus @@ -95,8 +97,8 @@ class PDFFetchStreamReader { if (!validateResponseStatus(response.status, this._stream.isHttp)) { throw createResponseStatusError(response.status, url); } - this._headersCapability.resolve(); this._reader = response.body.getReader(); + this._headersCapability.resolve(); let { allowRangeRequests, suggestedLength, } = validateRangeRequestCapabilities({ @@ -110,6 +112,12 @@ class PDFFetchStreamReader { this._contentLength = suggestedLength; this._isRangeSupported = allowRangeRequests; + + // We need to stop reading when range is supported and streaming is + // disabled. + if (!this._isStreamingSupported && this._isRangeSupported) { + this.cancel(new AbortException('streaming is disabled')); + } }).catch(this._headersCapability.reject); this.onProgress = null; diff --git a/src/display/node_stream.js b/src/display/node_stream.js index aca82a902..443989363 100644 --- a/src/display/node_stream.js +++ b/src/display/node_stream.js @@ -19,7 +19,9 @@ let http = __non_webpack_require__('http'); let https = __non_webpack_require__('https'); let url = __non_webpack_require__('url'); -import { assert, createPromiseCapability } from '../shared/util'; +import { + AbortException, assert, createPromiseCapability +} from '../shared/util'; import { validateRangeRequestCapabilities } from './network_utils'; class PDFNodeStream { @@ -165,6 +167,12 @@ class BaseFullReader { this._error(reason); }); + // We need to stop reading when range is supported and streaming is + // disabled. + if (!this._isStreamingSupported && this._isRangeSupported) { + this._error(new AbortException('streaming is disabled')); + } + // Destroy ReadableStream if already in errored state. if (this._errored) { this._readableStream.destroy(this._reason); @@ -353,8 +361,6 @@ class PDFNodeStreamFsFullReader extends BaseFullReader { constructor(stream) { super(stream); - this._setReadableStream(fs.createReadStream(this._url.path)); - fs.lstat(this._url.path, (error, stat) => { if (error) { this._errored = true; @@ -364,6 +370,8 @@ class PDFNodeStreamFsFullReader extends BaseFullReader { } // Setting right content length. this._contentLength = stat.size; + + this._setReadableStream(fs.createReadStream(this._url.path)); this._headersCapability.resolve(); }); } diff --git a/src/pdf.js b/src/pdf.js index c2c02a06a..e61964152 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -34,7 +34,8 @@ if (typeof PDFJSDev === 'undefined' || if (pdfjsSharedUtil.isNodeJS()) { var PDFNodeStream = require('./display/node_stream.js').PDFNodeStream; pdfjsDisplayAPI.setPDFNetworkStreamClass(PDFNodeStream); - } else if (typeof Response !== 'undefined' && 'body' in Response.prototype) { + } else if (typeof Response !== 'undefined' && 'body' in Response.prototype && + typeof ReadableStream !== 'undefined') { var PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream; pdfjsDisplayAPI.setPDFNetworkStreamClass(PDFFetchStream); } else { diff --git a/test/unit/jasmine-boot.js b/test/unit/jasmine-boot.js index 6a0d80d93..7dfa7321d 100644 --- a/test/unit/jasmine-boot.js +++ b/test/unit/jasmine-boot.js @@ -80,7 +80,8 @@ function initializePDFJS(callback) { var PDFFetchStream = modules[3].PDFFetchStream; // Set network stream class for unit tests. - if (typeof Response !== 'undefined' && 'body' in Response.prototype) { + if (typeof Response !== 'undefined' && 'body' in Response.prototype && + typeof ReadableStream !== 'undefined') { displayApi.setPDFNetworkStreamClass(PDFFetchStream); } else { displayApi.setPDFNetworkStreamClass(PDFNetworkStream);