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
};