You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							74 lines
						
					
					
						
							1.7 KiB
						
					
					
				
			
		
		
	
	
							74 lines
						
					
					
						
							1.7 KiB
						
					
					
				"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 | 
						|
  }; | 
						|
};
 | 
						|
 |