]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Proxy.php
Group selection: Respect "pubmail" and ignore atchived or blocked contacts
[friendica.git] / src / Module / Proxy.php
index 4387cc7ec2b82c928fe2ba73ca8a94cf52e26ac4..fbf4b8bd5cbfea81a6e216e583e016f160571820 100644 (file)
@@ -5,16 +5,13 @@
  */
 namespace Friendica\Module;
 
-use Friendica\App;
 use Friendica\BaseModule;
-use Friendica\Core\Config;
 use Friendica\Core\L10n;
 use Friendica\Core\System;
-use Friendica\Database\DBA;
+use Friendica\Core\Logger;
 use Friendica\Model\Photo;
 use Friendica\Object\Image;
-use Friendica\Util\DateTimeFormat;
-use Friendica\Util\Network;
+use Friendica\Util\HTTPSignature;
 use Friendica\Util\Proxy as ProxyUtils;
 
 /**
@@ -32,9 +29,8 @@ class Proxy extends BaseModule
         *
         * Sets application instance and checks if /proxy/ path is writable.
         *
-        * @param \Friendica\App $app Application instance
         */
-       public static function init()
+       public static function init(array $parameters = [])
        {
                // Set application instance here
                $a = self::getApp();
@@ -75,7 +71,7 @@ class Proxy extends BaseModule
                $request = self::getRequestInfo();
 
                if (empty($request['url'])) {
-                       System::httpExit(400, ['title' => L10n::t('Bad Request.')]);
+                       throw new \Friendica\Network\HTTPException\BadRequestException();
                }
 
                // Webserver already tried direct cache...
@@ -86,38 +82,37 @@ class Proxy extends BaseModule
                // Try to use photo from db
                self::responseFromDB($request);
 
-
                //
                // If script is here, the requested url has never cached before.
                // Let's fetch it, scale it if required, then save it in cache.
                //
 
-
                // It shouldn't happen but it does - spaces in URL
                $request['url'] = str_replace(' ', '+', $request['url']);
-               $redirects = 0;
-               $fetchResult = Network::fetchUrlFull($request['url'], true, $redirects, 10);
+               $fetchResult = HTTPSignature::fetchRaw($request['url'], local_user(), true, ['timeout' => 10]);
                $img_str = $fetchResult->getBody();
 
+               // If there is an error then return a blank image
+               if ((substr($fetchResult->getReturnCode(), 0, 1) == '4') || empty($img_str)) {
+                       Logger::info('Error fetching image', ['image' => $request['url'], 'return' => $fetchResult->getReturnCode(), 'empty' => empty($img_str)]);
+                       self::responseError();
+                       // stop.
+               }
+
                $tempfile = tempnam(get_temppath(), 'cache');
                file_put_contents($tempfile, $img_str);
                $mime = mime_content_type($tempfile);
                unlink($tempfile);
 
-               // If there is an error then return a blank image
-               if ((substr($fetchResult->getReturnCode(), 0, 1) == '4') || (!$img_str)) {
-                       self::responseError($request);
-                       // stop.
-               }
-
                $image = new Image($img_str, $mime);
                if (!$image->isValid()) {
-                       self::responseError($request);
+                       Logger::info('The image is invalid', ['image' => $request['url'], 'mime' => $mime]);
+                       self::responseError();
                        // stop.
                }
-               
+
                $basepath = $a->getBasePath();
-               
+
                // Store original image
                if ($direct_cache) {
                        // direct cache , store under ./proxy/
@@ -157,16 +152,16 @@ class Proxy extends BaseModule
         *      'size' => requested image size (int)
         *      'sizetype' => requested image size (string): ':micro', ':thumb', ':small', ':medium', ':large'
         *    ]
+        * @throws \Exception
         */
        private static function getRequestInfo()
        {
                $a = self::getApp();
-               $url = '';
                $size = 1024;
                $sizetype = '';
-               
-               
+
                // Look for filename in the arguments
+               // @TODO: Replace with parameter from router
                if (($a->argc > 1) && !isset($_REQUEST['url'])) {
                        if (isset($a->argv[3])) {
                                $url = $a->argv[3];
@@ -177,6 +172,7 @@ class Proxy extends BaseModule
                        }
 
                        /// @TODO: Why? And what about $url in this case?
+                       /// @TODO: Replace with parameter from router
                        if (isset($a->argv[3]) && ($a->argv[3] == 'thumb')) {
                                $size = 200;
                        }
@@ -214,9 +210,9 @@ class Proxy extends BaseModule
                        $url = base64_decode(strtr($url, '-_', '+/'), true);
 
                } else {
-                       $url = defaults($_REQUEST, 'url', '');
+                       $url = $_REQUEST['url'] ?? '';
                }
-               
+
                return [
                        'url' => $url,
                        'urlhash' => 'pic:' . sha1($url),
@@ -224,12 +220,13 @@ class Proxy extends BaseModule
                        'sizetype' => $sizetype,
                ];
        }
-       
-       
+
+
        /**
         * @brief setup ./proxy folder for direct cache
         *
         * @return bool  False if direct cache can't be used.
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function setupDirectCache()
        {
@@ -243,21 +240,23 @@ class Proxy extends BaseModule
 
                // Checking if caching into a folder in the webroot is activated and working
                $direct_cache = (is_dir($basepath . '/proxy') && is_writable($basepath . '/proxy'));
-               // we don't use direct cache if image url is passed in args and not in querystring 
+               // we don't use direct cache if image url is passed in args and not in querystring
                $direct_cache = $direct_cache && ($a->argc > 1) && !isset($_REQUEST['url']);
-               
+
                return $direct_cache;
        }
-       
-       
+
+
        /**
         * @brief Try to reply with image in cachefile
         *
-        * @param array $request  Array from getRequestInfo
+        * @param array $request Array from getRequestInfo
         *
         * @return string  Cache file name, empty string if cache is not enabled.
-        * 
+        *
         * If cachefile exists, script ends here and this function will never returns
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
         */
        private static function responseFromCache(&$request)
        {
@@ -269,16 +268,18 @@ class Proxy extends BaseModule
                }
                return $cachefile;
        }
-       
+
        /**
         * @brief Try to reply with image in database
         *
-        * @param array $request  Array from getRequestInfo
+        * @param array $request Array from getRequestInfo
         *
         * If the image exists in database, then script ends here and this function will never returns
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
         */
-       private static function responseFromDB(&$request) {
-       
+       private static function responseFromDB(&$request)
+       {
                $photo = Photo::getPhoto($request['urlhash']);
 
                if ($photo !== false) {
@@ -287,25 +288,27 @@ class Proxy extends BaseModule
                        // stop.
                }
        }
-       
+
        /**
-        * @brief Output a blank image, without cache headers, in case of errors
+        * In case of an error just stop. We don't return content to avoid caching problems
         *
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function responseError() {
-               header('Content-type: ' . $img->getType());
-               echo file_get_contents('images/blank.png');
-               exit();
+       private static function responseError()
+       {
+               throw new \Friendica\Network\HTTPException\InternalServerErrorException();
        }
-       
+
        /**
         * @brief Output the image with cache headers
         *
-        * @param Image $image
+        * @param Image $img
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function responseImageHttpCache(Image $img)
        {
                if (is_null($img) || !$img->isValid()) {
+                       Logger::info('The cached image is invalid');
                        self::responseError();
                        // stop.
                }
@@ -318,5 +321,3 @@ class Proxy extends BaseModule
                exit();
        }
 }
-
-