X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;ds=sidebyside;f=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FDataUriNormalizer.php;fp=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FDataUriNormalizer.php;h=9e5af130d03b756cdcc00de53667f38aa9879a44;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hp=0000000000000000000000000000000000000000;hpb=aea91e65e895364e460983b890e295aa5d5540a5;p=yaffs-website diff --git a/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php b/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php new file mode 100644 index 000000000..9e5af130d --- /dev/null +++ b/vendor/symfony/serializer/Normalizer/DataUriNormalizer.php @@ -0,0 +1,154 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Normalizer; + +use Symfony\Component\HttpFoundation\File\File; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser; +use Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserInterface; +use Symfony\Component\Serializer\Exception\InvalidArgumentException; +use Symfony\Component\Serializer\Exception\UnexpectedValueException; + +/** + * Normalizes an {@see \SplFileInfo} object to a data URI. + * Denormalizes a data URI to a {@see \SplFileObject} object. + * + * @author Kévin Dunglas + */ +class DataUriNormalizer implements NormalizerInterface, DenormalizerInterface +{ + /** + * @var MimeTypeGuesserInterface + */ + private $mimeTypeGuesser; + + public function __construct(MimeTypeGuesserInterface $mimeTypeGuesser = null) + { + if (null === $mimeTypeGuesser && class_exists('Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesser')) { + $mimeTypeGuesser = MimeTypeGuesser::getInstance(); + } + + $this->mimeTypeGuesser = $mimeTypeGuesser; + } + + /** + * {@inheritdoc} + */ + public function normalize($object, $format = null, array $context = array()) + { + if (!$object instanceof \SplFileInfo) { + throw new InvalidArgumentException('The object must be an instance of "\SplFileInfo".'); + } + + $mimeType = $this->getMimeType($object); + $splFileObject = $this->extractSplFileObject($object); + + $data = ''; + + $splFileObject->rewind(); + while (!$splFileObject->eof()) { + $data .= $splFileObject->fgets(); + } + + if ('text' === explode('/', $mimeType, 2)[0]) { + return sprintf('data:%s,%s', $mimeType, rawurlencode($data)); + } + + return sprintf('data:%s;base64,%s', $mimeType, base64_encode($data)); + } + + /** + * {@inheritdoc} + */ + public function supportsNormalization($data, $format = null) + { + return $data instanceof \SplFileInfo; + } + + /** + * {@inheritdoc} + * + * Regex adapted from Brian Grinstead code. + * + * @see https://gist.github.com/bgrins/6194623 + */ + public function denormalize($data, $class, $format = null, array $context = array()) + { + if (!preg_match('/^data:([a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}\/[a-z0-9][a-z0-9\!\#\$\&\-\^\_\+\.]{0,126}(;[a-z0-9\-]+\=[a-z0-9\-]+)?)?(;base64)?,[a-z0-9\!\$\&\\\'\,\(\)\*\+\,\;\=\-\.\_\~\:\@\/\?\%\s]*\s*$/i', $data)) { + throw new UnexpectedValueException('The provided "data:" URI is not valid.'); + } + + try { + switch ($class) { + case 'Symfony\Component\HttpFoundation\File\File': + return new File($data, false); + + case 'SplFileObject': + case 'SplFileInfo': + return new \SplFileObject($data); + } + } catch (\RuntimeException $exception) { + throw new UnexpectedValueException($exception->getMessage(), $exception->getCode(), $exception); + } + + throw new InvalidArgumentException(sprintf('The class parameter "%s" is not supported. It must be one of "SplFileInfo", "SplFileObject" or "Symfony\Component\HttpFoundation\File\File".', $class)); + } + + /** + * {@inheritdoc} + */ + public function supportsDenormalization($data, $type, $format = null) + { + $supportedTypes = array( + \SplFileInfo::class => true, + \SplFileObject::class => true, + 'Symfony\Component\HttpFoundation\File\File' => true, + ); + + return isset($supportedTypes[$type]); + } + + /** + * Gets the mime type of the object. Defaults to application/octet-stream. + * + * @param \SplFileInfo $object + * + * @return string + */ + private function getMimeType(\SplFileInfo $object) + { + if ($object instanceof File) { + return $object->getMimeType(); + } + + if ($this->mimeTypeGuesser && $mimeType = $this->mimeTypeGuesser->guess($object->getPathname())) { + return $mimeType; + } + + return 'application/octet-stream'; + } + + /** + * Returns the \SplFileObject instance associated with the given \SplFileInfo instance. + * + * @param \SplFileInfo $object + * + * @return \SplFileObject + */ + private function extractSplFileObject(\SplFileInfo $object) + { + if ($object instanceof \SplFileObject) { + return $object; + } + + return $object->openFile(); + } +}