From 65c7f488dd6f48b269e1b5b2859c4a16de255c04 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 92e87536214893..6c981e0ca8e793 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -486,5 +486,6 @@ export { DOMSVGFactory, StatTimer, DummyStatTimer, + isValidFetchUrl, loadScript, }; diff --git a/src/pdf.js b/src/pdf.js index 10c463df72659e..bd024d99264d80 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -38,14 +38,17 @@ if (typeof PDFJSDev === 'undefined' || PDFJSDev.test('GENERIC')) { pdfjsDisplayAPI.setPDFNetworkStreamFactory((params) => { return new PDFNodeStream(params); }); - } else if (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 (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); }); } @@ -70,8 +73,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 474cefe8e4e932..e83a8b0227d585 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); + }); + }); });