diff --git a/samples/advanced/extend.html b/samples/advanced/extend.html index 27e9151a9f..e8e86e93e5 100644 --- a/samples/advanced/extend.html +++ b/samples/advanced/extend.html @@ -38,7 +38,24 @@ modifyRequestURL: function (url) { /* Modify url adding a custom query string parameter */ return url + '?customQuery=value'; - } + }, + modifyRequest(request) { + /* Modify the entire request. Allows for async modifications */ + var url = new URL(request.url); + + if (!/\.mpd$/.test(url.pathname)) { + return; + } + + return fetch('https://time.akamai.com') + .then(function (response) { + return response.text(); + }) + .then(function (text) { + url.searchParams.set('now', text); + request.url = url.toString(); + }); + }, }; }); player.initialize(video, url, true); diff --git a/src/streaming/net/FetchLoader.js b/src/streaming/net/FetchLoader.js index b35339ed01..f8aa23fefa 100644 --- a/src/streaming/net/FetchLoader.js +++ b/src/streaming/net/FetchLoader.js @@ -32,6 +32,7 @@ import FactoryMaker from '../../core/FactoryMaker'; import Settings from '../../core/Settings'; import Constants from '../constants/Constants'; +import { modifyRequest } from '../utils/RequestModifier'; /** * @module FetchLoader @@ -54,7 +55,16 @@ function FetchLoader(cfg) { } function load(httpRequest) { + if (requestModifier && requestModifier.modifyRequest) { + modifyRequest(httpRequest, requestModifier) + .then(() => request(httpRequest)); + } + else { + request(httpRequest); + } + } + function request(httpRequest) { // Variables will be used in the callback functions const requestStartTime = new Date(); const request = httpRequest.request; @@ -77,7 +87,7 @@ function FetchLoader(cfg) { request.requestStartDate = requestStartTime; } - if (requestModifier) { + if (requestModifier && requestModifier.modifyRequestHeader) { // modifyRequestHeader expects a XMLHttpRequest object so, // to keep backward compatibility, we should expose a setRequestHeader method // TODO: Remove RequestModifier dependency on XMLHttpRequest object and define @@ -176,7 +186,7 @@ function FetchLoader(cfg) { reader.read().then(function processFetch(args) { const value = args.value; const done = args.done; - markB = Date.now() + markB = Date.now(); if (value && value.length) { const chunkDownloadDurationMS = markB - markA; diff --git a/src/streaming/net/HTTPLoader.js b/src/streaming/net/HTTPLoader.js index 26ec382903..8e13addd27 100644 --- a/src/streaming/net/HTTPLoader.js +++ b/src/streaming/net/HTTPLoader.js @@ -271,7 +271,7 @@ function HTTPLoader(cfg) { } let headers = null; - let modifiedUrl = requestModifier.modifyRequestURL(request.url); + let modifiedUrl = requestModifier.modifyRequestURL ? requestModifier.modifyRequestURL(request.url) : request.url; if (settings.get().streaming.cmcd && settings.get().streaming.cmcd.enabled) { const cmcdMode = settings.get().streaming.cmcd.mode; if (cmcdMode === Constants.CMCD_MODE_QUERY) { diff --git a/src/streaming/net/XHRLoader.js b/src/streaming/net/XHRLoader.js index cd58bd7daf..f62d24056d 100644 --- a/src/streaming/net/XHRLoader.js +++ b/src/streaming/net/XHRLoader.js @@ -29,6 +29,7 @@ * POSSIBILITY OF SUCH DAMAGE. */ import FactoryMaker from '../../core/FactoryMaker'; +import { modifyRequest } from '../utils/RequestModifier'; /** * @module XHRLoader @@ -44,7 +45,16 @@ function XHRLoader(cfg) { let instance; function load(httpRequest) { + if (requestModifier && requestModifier.modifyRequest) { + modifyRequest(httpRequest, requestModifier) + .then(() => request(httpRequest)); + } + else { + request(httpRequest); + } + } + function request(httpRequest) { // Variables will be used in the callback functions const requestStartTime = new Date(); const request = httpRequest.request; @@ -64,7 +74,7 @@ function XHRLoader(cfg) { request.requestStartDate = requestStartTime; } - if (requestModifier) { + if (requestModifier && requestModifier.modifyRequestHeader) { xhr = requestModifier.modifyRequestHeader(xhr, { url: httpRequest.url }); diff --git a/src/streaming/utils/RequestModifier.js b/src/streaming/utils/RequestModifier.js index 06fbe8425d..80ff3e943f 100644 --- a/src/streaming/utils/RequestModifier.js +++ b/src/streaming/utils/RequestModifier.js @@ -31,6 +31,20 @@ import FactoryMaker from '../../core/FactoryMaker'; +export function modifyRequest(httpRequest, requestModifier) { + const request = { + url: httpRequest.url, + method: httpRequest.method, + headers: Object.assign({}, httpRequest.headers), + credentials: httpRequest.withCredentials ? 'include' : undefined, + }; + + return Promise.resolve(requestModifier.modifyRequest(request)) + .then(() => + Object.assign(httpRequest, request, { withCredentials: request.credentials === 'include' }) + ); +} + function RequestModifier() { let instance; @@ -40,11 +54,12 @@ function RequestModifier() { } // eslint-disable-next-line no-unused-vars - function modifyRequestHeader(request, {url}) { + function modifyRequestHeader(request, { url }) { return request; } instance = { + modifyRequest: null, modifyRequestURL: modifyRequestURL, modifyRequestHeader: modifyRequestHeader };