. * */ namespace Friendica\Core\Storage\Type; use Exception; use Friendica\Core\Logger; use Friendica\Core\Storage\Exception\ReferenceStorageException; use Friendica\Core\Storage\Capability\ICanReadFromStorage; use Friendica\Network\HTTPClient\Client\HttpClientAccept; use Friendica\Network\HTTPClient\Client\HttpClientOptions; use Friendica\Util\HTTPSignature; /** * External resource storage class * * This class is used to load external resources, like images. * Is not intended to be selectable by admins as default storage class. */ class ExternalResource implements ICanReadFromStorage { const NAME = 'ExternalResource'; /** * @inheritDoc */ public function get(string $reference): string { $data = json_decode($reference); if (empty($data->url)) { throw new ReferenceStorageException(sprintf('Invalid reference %s, cannot retrieve URL', $reference)); } $parts = parse_url($data->url); if (empty($parts['scheme']) || empty($parts['host'])) { throw new ReferenceStorageException(sprintf('Invalid reference %s, cannot extract scheme and host', $reference)); } try { $fetchResult = HTTPSignature::fetchRaw($data->url, $data->uid, [HttpClientOptions::ACCEPT_CONTENT => [HttpClientAccept::IMAGE]]); } catch (Exception $exception) { throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $exception->getCode(), $exception); } if (!empty($fetchResult) && $fetchResult->isSuccess()) { Logger::debug('Got picture', ['Content-Type' => $fetchResult->getHeader('Content-Type'), 'uid' => $data->uid, 'url' => $data->url]); return $fetchResult->getBody(); } else { if (empty($fetchResult)) { throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference)); } else { throw new ReferenceStorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBody())); } } } /** * @inheritDoc */ public function __toString(): string { return self::NAME; } /** * @inheritDoc */ public static function getName(): string { return self::NAME; } }