vendor/mpdf/mpdf/src/AssetFetcher.php line 51

Open in your IDE?
  1. <?php
  2. namespace Mpdf;
  3. use Mpdf\File\LocalContentLoaderInterface;
  4. use Mpdf\File\StreamWrapperChecker;
  5. use Mpdf\Http\ClientInterface;
  6. use Mpdf\Http\Request;
  7. use Mpdf\Log\Context as LogContext;
  8. use Psr\Log\LoggerInterface;
  9. class AssetFetcher implements \Psr\Log\LoggerAwareInterface
  10. {
  11.     private $mpdf;
  12.     private $contentLoader;
  13.     private $http;
  14.     private $logger;
  15.     public function __construct(Mpdf $mpdfLocalContentLoaderInterface $contentLoaderClientInterface $httpLoggerInterface $logger)
  16.     {
  17.         $this->mpdf $mpdf;
  18.         $this->contentLoader $contentLoader;
  19.         $this->http $http;
  20.         $this->logger $logger;
  21.     }
  22.     public function fetchDataFromPath($path$originalSrc null)
  23.     {
  24.         /**
  25.          * Prevents insecure PHP object injection through phar:// wrapper
  26.          * @see https://github.com/mpdf/mpdf/issues/949
  27.          * @see https://github.com/mpdf/mpdf/issues/1381
  28.          */
  29.         $wrapperChecker = new StreamWrapperChecker($this->mpdf);
  30.         if ($wrapperChecker->hasBlacklistedStreamWrapper($path)) {
  31.             throw new \Mpdf\Exception\AssetFetchingException('File contains an invalid stream. Only ' implode(', '$wrapperChecker->getWhitelistedStreamWrappers()) . ' streams are allowed.');
  32.         }
  33.         if ($originalSrc && $wrapperChecker->hasBlacklistedStreamWrapper($originalSrc)) {
  34.             throw new \Mpdf\Exception\AssetFetchingException('File contains an invalid stream. Only ' implode(', '$wrapperChecker->getWhitelistedStreamWrappers()) . ' streams are allowed.');
  35.         }
  36.         $this->mpdf->GetFullPath($path);
  37.         return $this->isPathLocal($path) || ($originalSrc !== null && $this->isPathLocal($originalSrc))
  38.             ? $this->fetchLocalContent($path$originalSrc)
  39.             : $this->fetchRemoteContent($path);
  40.     }
  41.     public function fetchLocalContent($path$originalSrc)
  42.     {
  43.         $data '';
  44.         if ($originalSrc && $this->mpdf->basepathIsLocal && $check = @fopen($originalSrc'rb')) {
  45.             fclose($check);
  46.             $path $originalSrc;
  47.             $this->logger->debug(sprintf('Fetching content of file "%s" with local basepath'$path), ['context' => LogContext::REMOTE_CONTENT]);
  48.             return $this->contentLoader->load($path);
  49.         }
  50.         if ($path && $check = @fopen($path'rb')) {
  51.             fclose($check);
  52.             $this->logger->debug(sprintf('Fetching content of file "%s" with non-local basepath'$path), ['context' => LogContext::REMOTE_CONTENT]);
  53.             return $this->contentLoader->load($path);
  54.         }
  55.         return $data;
  56.     }
  57.     public function fetchRemoteContent($path)
  58.     {
  59.         $data '';
  60.         try {
  61.             $this->logger->debug(sprintf('Fetching remote content of file "%s"'$path), ['context' => LogContext::REMOTE_CONTENT]);
  62.             /** @var \Mpdf\Http\Response $response */
  63.             $response $this->http->sendRequest(new Request('GET'$path));
  64.             if ($response->getStatusCode() !== 200) {
  65.                 $message sprintf('Non-OK HTTP response "%s" on fetching remote content "%s" because of an error'$response->getStatusCode(), $path);
  66.                 if ($this->mpdf->debug) {
  67.                     throw new \Mpdf\MpdfException($message);
  68.                 }
  69.                 $this->logger->info($message);
  70.                 return $data;
  71.             }
  72.             $data $response->getBody()->getContents();
  73.         } catch (\InvalidArgumentException $e) {
  74.             $message sprintf('Unable to fetch remote content "%s" because of an error "%s"'$path$e->getMessage());
  75.             if ($this->mpdf->debug) {
  76.                 throw new \Mpdf\MpdfException($message0$e);
  77.             }
  78.             $this->logger->warning($message);
  79.         }
  80.         return $data;
  81.     }
  82.     public function isPathLocal($path)
  83.     {
  84.         return strpos($path'://') === false// @todo More robust implementation
  85.     }
  86.     public function setLogger(LoggerInterface $logger)
  87.     {
  88.         $this->logger $logger;
  89.     }
  90. }