Spaces:
Paused
Paused
| ; | |
| 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 { | |
| mimeTypeRecord = new MIMEType("text/plain;charset=US-ASCII"); | |
| } | |
| return { | |
| mimeType: mimeTypeRecord, | |
| body | |
| }; | |
| }; | |