Skip to content

Commit

Permalink
Expose data uri parsing to the HLS parser
Browse files Browse the repository at this point in the history
Widevine HLS manifests have a data URI that needs to be parsed to
generate DrmInfo.  Rather than write another parser, factor the data
URI networking plugin to expose the parser to other classes.

Issue #279

Change-Id: I71f174b86cc3b0ae0e8dbc31701ea9d36cd157ee
  • Loading branch information
joeyparrish committed Mar 30, 2017
1 parent b00bbc4 commit 0243671
Showing 1 changed file with 56 additions and 46 deletions.
102 changes: 56 additions & 46 deletions lib/net/data_uri_plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,56 +35,14 @@ goog.require('shaka.util.Uint8ArrayUtils');
*/
shaka.net.DataUriPlugin = function(uri, request) {
return new Promise(function(resolve, reject) {
// Extract the scheme.
var parts = uri.split(':');
if (parts.length < 2 || parts[0] != 'data') {
shaka.log.error('Bad data URI, failed to parse scheme');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.MALFORMED_DATA_URI,
uri);
}
var path = parts.slice(1).join(':');

// Extract the encoding and MIME type (required but can be empty).
var infoAndData = path.split(',');
if (infoAndData.length < 2) {
shaka.log.error('Bad data URI, failed to extract encoding and MIME type');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.MALFORMED_DATA_URI,
uri);
}
var info = infoAndData[0];
var dataStr = window.decodeURIComponent(infoAndData.slice(1).join(','));

// Extract the encoding (optional).
var typeAndEncoding = info.split(';');
var encoding = null;
if (typeAndEncoding.length > 1)
encoding = typeAndEncoding[1];

// Convert the data.
/** @type {ArrayBuffer} */
var data;
if (encoding == 'base64') {
data = shaka.util.Uint8ArrayUtils.fromBase64(dataStr).buffer;
} else if (encoding) {
shaka.log.error('Bad data URI, unknown encoding');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.UNKNOWN_DATA_URI_ENCODING,
uri);
} else {
data = shaka.util.StringUtils.toUTF8(dataStr);
}
var parsed = shaka.net.DataUriPlugin.parse(uri);

/** @type {shakaExtern.Response} */
var response = {
uri: uri,
data: data,
data: parsed.data,
headers: {
'content-type': typeAndEncoding[0]
'content-type': parsed.contentType
}
};

Expand All @@ -93,5 +51,57 @@ shaka.net.DataUriPlugin = function(uri, request) {
};


shaka.net.NetworkingEngine.registerScheme('data', shaka.net.DataUriPlugin);
/**
* @param {string} uri
* @return {{data: ArrayBuffer, contentType: string}}
*/
shaka.net.DataUriPlugin.parse = function(uri) {
// Extract the scheme.
var parts = uri.split(':');
if (parts.length < 2 || parts[0] != 'data') {
shaka.log.error('Bad data URI, failed to parse scheme');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.MALFORMED_DATA_URI,
uri);
}
var path = parts.slice(1).join(':');

// Extract the encoding and MIME type (required but can be empty).
var infoAndData = path.split(',');
if (infoAndData.length < 2) {
shaka.log.error('Bad data URI, failed to extract encoding and MIME type');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.MALFORMED_DATA_URI,
uri);
}
var info = infoAndData[0];
var dataStr = window.decodeURIComponent(infoAndData.slice(1).join(','));

// Extract the encoding (optional).
var typeAndEncoding = info.split(';');
var encoding = null;
if (typeAndEncoding.length > 1)
encoding = typeAndEncoding[1];

// Convert the data.
/** @type {ArrayBuffer} */
var data;
if (encoding == 'base64') {
data = shaka.util.Uint8ArrayUtils.fromBase64(dataStr).buffer;
} else if (encoding) {
shaka.log.error('Bad data URI, unknown encoding');
throw new shaka.util.Error(
shaka.util.Error.Category.NETWORK,
shaka.util.Error.Code.UNKNOWN_DATA_URI_ENCODING,
uri);
} else {
data = shaka.util.StringUtils.toUTF8(dataStr);
}

return {data: data, contentType: typeAndEncoding[0]};
};


shaka.net.NetworkingEngine.registerScheme('data', shaka.net.DataUriPlugin);

0 comments on commit 0243671

Please sign in to comment.