]> git.mxchange.org Git - friendica.git/blobdiff - src/Module/Proxy.php
Merge pull request #7107 from nupplaphil/bug/mod_fix_routes
[friendica.git] / src / Module / Proxy.php
index b975069e7adbb5596fd9c7e53c8d69577184ca5b..75a1142af6221331ce4715d3a87c7f8988a7c44f 100644 (file)
@@ -5,16 +5,12 @@
  */
 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\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,7 +28,6 @@ class Proxy extends BaseModule
         *
         * Sets application instance and checks if /proxy/ path is writable.
         *
-        * @param \Friendica\App $app Application instance
         */
        public static function init()
        {
@@ -75,7 +70,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,36 +81,35 @@ 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();
 
-               $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);
+                       self::responseError();
                        // stop.
                }
 
+               $tempfile = tempnam(get_temppath(), 'cache');
+               file_put_contents($tempfile, $img_str);
+               $mime = mime_content_type($tempfile);
+               unlink($tempfile);
+
                $image = new Image($img_str, $mime);
                if (!$image->isValid()) {
-                       self::responseError($request);
+                       self::responseError();
                        // stop.
                }
-               
+
+               $basepath = $a->getBasePath();
+
                // Store original image
                if ($direct_cache) {
                        // direct cache , store under ./proxy/
@@ -155,16 +149,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];
@@ -175,6 +169,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,7 +209,7 @@ class Proxy extends BaseModule
                } else {
                        $url = defaults($_REQUEST, 'url', '');
                }
-               
+
                return [
                        'url' => $url,
                        'urlhash' => 'pic:' . sha1($url),
@@ -222,12 +217,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()
        {
@@ -241,21 +237,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)
        {
@@ -267,16 +265,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) {
@@ -285,21 +285,23 @@ class Proxy extends BaseModule
                        // stop.
                }
        }
-       
+
        /**
         * @brief Output a blank image, without cache headers, in case of errors
         *
         */
-       private static function responseError() {
-               header('Content-type: ' . $img->getType());
+       private static function responseError()
+       {
+               header('Content-type: image/png');
                echo file_get_contents('images/blank.png');
                exit();
        }
-       
+
        /**
         * @brief Output the image with cache headers
         *
-        * @param Image $image
+        * @param Image $img
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
        private static function responseImageHttpCache(Image $img)
        {