From f664e074c99b0a4a81932d13b2ab5bb3761e5da5 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 26 Feb 2019 20:24:06 +0100 Subject: [PATCH] Avoid using the Fetch API, in `GENERIC` builds, for unsupported protocols (issue 10587) --- src/display/display_utils.js | 1 + src/pdf.js | 17 ++++++++++------- test/unit/display_utils_spec.js | 26 +++++++++++++++++++++++++- 3 files changed, 36 insertions(+), 8 deletions(-) diff --git a/src/display/display_utils.js b/src/display/display_utils.js index df565ebac..faaeedd9d 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -490,5 +490,6 @@ export { StatTimer, DummyStatTimer, isFetchSupported, + isValidFetchUrl, loadScript, }; diff --git a/src/pdf.js b/src/pdf.js index 2250abc7f..32895bae3 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -37,14 +37,17 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => { return new PDFNodeStream(params); }); - } else if (pdfjsDisplayDisplayUtils.isFetchSupported()) { - let PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream; - pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => { - return new PDFFetchStream(params); - }); } else { let PDFNetworkStream = require('./display/network.js').PDFNetworkStream; + let PDFFetchStream; + if (pdfjsDisplayDisplayUtils.isFetchSupported()) { + PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream; + } pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => { + if (PDFFetchStream && + pdfjsDisplayDisplayUtils.isValidFetchUrl(params.url)) { + return new PDFFetchStream(params); + } return new PDFNetworkStream(params); }); } @@ -69,8 +72,8 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { PDFFetchStream = require('./display/fetch_stream.js').PDFFetchStream; } pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => { - if (PDFFetchStream && /^https?:/i.test(params.url)) { - // "fetch" is only supported for http(s), not file/ftp. + if (PDFFetchStream && + pdfjsDisplayDisplayUtils.isValidFetchUrl(params.url)) { return new PDFFetchStream(params); } return new PDFNetworkStream(params); diff --git a/test/unit/display_utils_spec.js b/test/unit/display_utils_spec.js index 474cefe8e..67f339fa7 100644 --- a/test/unit/display_utils_spec.js +++ b/test/unit/display_utils_spec.js @@ -14,7 +14,7 @@ */ import { - DOMSVGFactory, getFilenameFromUrl + DOMSVGFactory, getFilenameFromUrl, isValidFetchUrl } from '../../src/display/display_utils'; import isNodeJS from '../../src/shared/is_node'; @@ -94,4 +94,28 @@ describe('display_utils', function() { expect(result).toEqual(expected); }); }); + + describe('isValidFetchUrl', function() { + it('handles invalid Fetch URLs', function() { + expect(isValidFetchUrl(null)).toEqual(false); + expect(isValidFetchUrl(100)).toEqual(false); + expect(isValidFetchUrl('foo')).toEqual(false); + expect(isValidFetchUrl('/foo', 100)).toEqual(false); + }); + + it('handles relative Fetch URLs', function() { + expect(isValidFetchUrl('/foo', 'file://www.example.com')).toEqual(false); + expect(isValidFetchUrl('/foo', 'http://www.example.com')).toEqual(true); + }); + + it('handles unsupported Fetch protocols', function() { + expect(isValidFetchUrl('file://www.example.com')).toEqual(false); + expect(isValidFetchUrl('ftp://www.example.com')).toEqual(false); + }); + + it('handles supported Fetch protocols', function() { + expect(isValidFetchUrl('http://www.example.com')).toEqual(true); + expect(isValidFetchUrl('https://www.example.com')).toEqual(true); + }); + }); });