diff options
Diffstat (limited to 'node_modules/data-urls/lib')
| -rw-r--r-- | node_modules/data-urls/lib/parser.js | 74 | ||||
| -rw-r--r-- | node_modules/data-urls/lib/utils.js | 23 | 
2 files changed, 97 insertions, 0 deletions
diff --git a/node_modules/data-urls/lib/parser.js b/node_modules/data-urls/lib/parser.js new file mode 100644 index 0000000..37be0ef --- /dev/null +++ b/node_modules/data-urls/lib/parser.js @@ -0,0 +1,74 @@ +"use strict"; +const MIMEType = require("whatwg-mimetype"); +const { parseURL, serializeURL } = require("whatwg-url"); +const { +  stripLeadingAndTrailingASCIIWhitespace, +  stringPercentDecode, +  isomorphicDecode, +  forgivingBase64Decode +} = require("./utils.js"); + +module.exports = stringInput => { +  const urlRecord = parseURL(stringInput); + +  if (urlRecord === null) { +    return null; +  } + +  return module.exports.fromURLRecord(urlRecord); +}; + +module.exports.fromURLRecord = urlRecord => { +  if (urlRecord.scheme !== "data") { +    return null; +  } + +  const input = serializeURL(urlRecord, true).substring("data:".length); + +  let position = 0; + +  let mimeType = ""; +  while (position < input.length && input[position] !== ",") { +    mimeType += input[position]; +    ++position; +  } +  mimeType = stripLeadingAndTrailingASCIIWhitespace(mimeType); + +  if (position === input.length) { +    return null; +  } + +  ++position; + +  const encodedBody = input.substring(position); + +  let body = stringPercentDecode(encodedBody); + +  // Can't use /i regexp flag because it isn't restricted to ASCII. +  const mimeTypeBase64MatchResult = /(.*); *[Bb][Aa][Ss][Ee]64$/.exec(mimeType); +  if (mimeTypeBase64MatchResult) { +    const stringBody = isomorphicDecode(body); +    body = forgivingBase64Decode(stringBody); + +    if (body === null) { +      return null; +    } +    mimeType = mimeTypeBase64MatchResult[1]; +  } + +  if (mimeType.startsWith(";")) { +    mimeType = "text/plain" + mimeType; +  } + +  let mimeTypeRecord; +  try { +    mimeTypeRecord = new MIMEType(mimeType); +  } catch (e) { +    mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII"); +  } + +  return { +    mimeType: mimeTypeRecord, +    body +  }; +}; diff --git a/node_modules/data-urls/lib/utils.js b/node_modules/data-urls/lib/utils.js new file mode 100644 index 0000000..213029f --- /dev/null +++ b/node_modules/data-urls/lib/utils.js @@ -0,0 +1,23 @@ +"use strict"; +const { percentDecode } = require("whatwg-url"); +const { atob } = require("abab"); + +exports.stripLeadingAndTrailingASCIIWhitespace = string => { +  return string.replace(/^[ \t\n\f\r]+/, "").replace(/[ \t\n\f\r]+$/, ""); +}; + +exports.stringPercentDecode = input => { +  return percentDecode(Buffer.from(input, "utf-8")); +}; + +exports.isomorphicDecode = input => { +  return input.toString("binary"); +}; + +exports.forgivingBase64Decode = data => { +  const asString = atob(data); +  if (asString === null) { +    return null; +  } +  return Buffer.from(asString, "binary"); +};  | 
