Sha256: 4470315075a54661e1d284b23226e0cfadaa423228f65d85b089cee83b89cc4a
Contents?: true
Size: 1.65 KB
Versions: 26
Compression:
Stored size: 1.65 KB
Contents
"use strict"; const MIMEType = require("whatwg-mimetype"); const { parseURL, serializeURL, percentDecodeString } = require("whatwg-url"); const { stripLeadingAndTrailingASCIIWhitespace, 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 = percentDecodeString(encodedBody); // Can't use /i regexp flag because it isn't restricted to ASCII. const mimeTypeBase64MatchResult = /(.*); *[Bb][Aa][Ss][Ee]64$/u.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 }; };
Version data entries
26 entries across 26 versions & 1 rubygems