. * */ namespace Friendica\Model\Storage; use Exception; 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 IStorage { 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, ['accept_content' => '']); } catch (Exception $exception) { throw new StorageException(sprintf('External resource failed to get %s', $reference), $exception->getCode(), $exception); } if ($fetchResult->isSuccess()) { return $fetchResult->getBody(); } else { throw new StorageException(sprintf('External resource failed to get %s', $reference), $fetchResult->getReturnCode(), new Exception($fetchResult->getBody())); } } /** * @inheritDoc */ public function __toString() { return self::NAME; } /** * @inheritDoc */ public static function getName(): string { return self::NAME; } }