2021-06-24 13:30:22 -04:00
< ? php
/**
* @ copyright Copyright ( C ) 2010 - 2021 , the Friendica project
*
* @ license GNU AGPL version 3 or any later version
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation , either version 3 of the
* License , or ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* You should have received a copy of the GNU Affero General Public License
* along with this program . If not , see < https :// www . gnu . org / licenses />.
*
*/
namespace Friendica\Model\Storage ;
2021-08-01 07:06:19 -04:00
use Exception ;
2021-06-28 06:08:51 -04:00
use Friendica\Util\HTTPSignature ;
2021-06-24 13:30:22 -04:00
/**
* 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
*/
2021-08-01 07:06:19 -04:00
public function get ( string $reference ) : string
2021-06-24 13:30:22 -04:00
{
2021-06-28 06:08:51 -04:00
$data = json_decode ( $reference );
if ( empty ( $data -> url )) {
2021-08-01 07:06:19 -04:00
throw new ReferenceStorageException ( sprintf ( 'Invalid reference %s, cannot retrieve URL' , $reference ));
2021-06-28 06:08:51 -04:00
}
$parts = parse_url ( $data -> url );
2021-06-24 13:30:22 -04:00
if ( empty ( $parts [ 'scheme' ]) || empty ( $parts [ 'host' ])) {
2021-08-01 07:06:19 -04:00
throw new ReferenceStorageException ( sprintf ( 'Invalid reference %s, cannot extract scheme and host' , $reference ));
2021-06-24 13:30:22 -04:00
}
2021-08-01 07:06:19 -04:00
try {
2021-08-24 08:17:42 -04:00
$fetchResult = HTTPSignature :: fetchRaw ( $data -> url , $data -> uid , [ 'accept_content' => []]);
2021-08-01 07:06:19 -04:00
} catch ( Exception $exception ) {
2021-08-01 08:00:48 -04:00
throw new ReferenceStorageException ( sprintf ( 'External resource failed to get %s' , $reference ), $exception -> getCode (), $exception );
2021-08-01 07:06:19 -04:00
}
2021-06-28 06:08:51 -04:00
if ( $fetchResult -> isSuccess ()) {
return $fetchResult -> getBody ();
2021-06-24 13:30:22 -04:00
} else {
2021-08-01 08:00:48 -04:00
throw new ReferenceStorageException ( sprintf ( 'External resource failed to get %s' , $reference ), $fetchResult -> getReturnCode (), new Exception ( $fetchResult -> getBody ()));
2021-06-24 13:30:22 -04:00
}
}
/**
* @ inheritDoc
*/
public function __toString ()
{
return self :: NAME ;
}
/**
* @ inheritDoc
*/
2021-08-01 07:06:19 -04:00
public static function getName () : string
2021-06-24 13:30:22 -04:00
{
return self :: NAME ;
}
}