]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/CurlResult.php
Merge pull request #10801 from annando/network-thread-view
[friendica.git] / src / Network / CurlResult.php
index b9ab07be9f2f27c93dedb29b772e5efc7f325bb4..1c74634db48d2b67a55bf286b82160360af206be 100644 (file)
@@ -1,15 +1,35 @@
 <?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\Network;
 
 use Friendica\Core\Logger;
+use Friendica\Core\System;
 use Friendica\Network\HTTPException\InternalServerErrorException;
 use Friendica\Util\Network;
 
 /**
  * A content class for Curl call results
  */
-class CurlResult
+class CurlResult implements IHTTPResult
 {
        /**
         * @var int HTTP return code or 0 if timeout or failure
@@ -26,6 +46,11 @@ class CurlResult
         */
        private $header;
 
+       /**
+        * @var array the HTTP headers of the Curl call
+        */
+       private $header_fields;
+
        /**
         * @var boolean true (if HTTP 2xx result) or false
         */
@@ -76,7 +101,7 @@ class CurlResult
         *
         * @param string $url optional URL
         *
-        * @return CurlResult a CURL with error response
+        * @return IHTTPResult a CURL with error response
         * @throws InternalServerErrorException
         */
        public static function createErrorCurl($url = '')
@@ -106,7 +131,7 @@ class CurlResult
                $this->errorNumber = $errorNumber;
                $this->error = $error;
 
-               Logger::log($url . ': ' . $this->returnCode . " " . $result, Logger::DATA);
+               Logger::debug('construct', ['url' => $url, 'returncode' => $this->returnCode, 'result' => $result]);
 
                $this->parseBodyHeader($result);
                $this->checkSuccess();
@@ -129,6 +154,7 @@ class CurlResult
 
                $this->body = substr($result, strlen($header));
                $this->header = $header;
+               $this->header_fields = []; // Is filled on demand
        }
 
        private function checkSuccess()
@@ -141,8 +167,8 @@ class CurlResult
                }
 
                if (!$this->isSuccess) {
-                       Logger::log('error: ' . $this->url . ': ' . $this->returnCode . ' - ' . $this->error, Logger::INFO);
-                       Logger::log('debug: ' . print_r($this->info, true), Logger::DATA);
+                       Logger::notice('http error', ['url' => $this->url, 'code' => $this->returnCode, 'error'  => $this->error, 'callstack' => System::callstack(20)]);
+                       Logger::debug('debug', ['info' => $this->info]);
                }
 
                if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) {
@@ -161,7 +187,7 @@ class CurlResult
                }
 
                if ($this->returnCode == 301 || $this->returnCode == 302 || $this->returnCode == 303 || $this->returnCode== 307) {
-                       $redirect_parts = parse_url(defaults($this->info, 'redirect_url', ''));
+                       $redirect_parts = parse_url($this->info['redirect_url'] ?? '');
                        if (empty($redirect_parts)) {
                                $redirect_parts = [];
                        }
@@ -173,7 +199,7 @@ class CurlResult
                                }
                        }
 
-                       $parts = parse_url(defaults($this->info, 'url', ''));
+                       $parts = parse_url($this->info['url'] ?? '');
                        if (empty($parts)) {
                                $parts = [];
                        }
@@ -203,141 +229,119 @@ class CurlResult
                }
        }
 
-       /**
-        * Gets the Curl Code
-        *
-        * @return string The Curl Code
-        */
+       /** {@inheritDoc} */
        public function getReturnCode()
        {
                return $this->returnCode;
        }
 
-       /**
-        * Returns the Curl Content Type
-        *
-        * @return string the Curl Content Type
-        */
+       /** {@inheritDoc} */
        public function getContentType()
        {
                return $this->contentType;
        }
 
-       /**
-        * Returns the Curl headers
-        *
-        * @param string $field optional header field. Return all fields if empty
-        *
-        * @return string|bool the Curl headers, "false" when field isn't found
-        */
-       public function getHeader(string $field = '')
+       /** {@inheritDoc} */
+       public function getHeader($header)
        {
-               if (empty($field)) {
-                       return $this->header;
+               if (empty($header)) {
+                       return [];
                }
 
-               $lines = explode("\n", $this->header);
-               foreach ($lines as $line) {
-                       $parts = explode(':', $line);
-                       $headerfield = array_shift($parts);
-                       if (strtolower(trim($field)) == strtolower(trim($headerfield))) {
-                               return trim(implode(':', $parts));
-                       }
+               $header = strtolower(trim($header));
+
+               $headers = $this->getHeaderArray();
+
+               if (isset($headers[$header])) {
+                       return $headers[$header];
                }
 
-               return false;
+               return [];
        }
 
-       /**
-        * Returns the Curl headers as an associated array
-        *
-        * @return array associated header array
-        */
+       /** {@inheritDoc} */
+       public function getHeaders()
+       {
+               return $this->getHeaderArray();
+       }
+
+       /** {@inheritDoc} */
+       public function inHeader(string $field)
+       {
+               $field = strtolower(trim($field));
+
+               $headers = $this->getHeaderArray();
+
+               return array_key_exists($field, $headers);
+       }
+
+       /** {@inheritDoc} */
        public function getHeaderArray()
        {
-               $headers = [];
+               if (!empty($this->header_fields)) {
+                       return $this->header_fields;
+               }
 
-               $lines = explode("\n", $this->header);
+               $this->header_fields = [];
+
+               $lines = explode("\n", trim($this->header));
                foreach ($lines as $line) {
                        $parts = explode(':', $line);
                        $headerfield = strtolower(trim(array_shift($parts)));
                        $headerdata = trim(implode(':', $parts));
-
-                       if (!empty($headerdata)) {
-                               $headers[$headerfield] = $headerdata;
+                       if (empty($this->header_fields[$headerfield])) {
+                               $this->header_fields[$headerfield] = [$headerdata];
+                       } elseif (!in_array($headerdata, $this->header_fields[$headerfield])) {
+                               $this->header_fields[$headerfield][] = $headerdata;
                        }
                }
 
-               return $headers;
+               return $this->header_fields;
        }
 
-       /**
-        * @return bool
-        */
+       /** {@inheritDoc} */
        public function isSuccess()
        {
                return $this->isSuccess;
        }
 
-       /**
-        * @return string
-        */
+       /** {@inheritDoc} */
        public function getUrl()
        {
                return $this->url;
        }
 
-       /**
-        * @return string
-        */
+       /** {@inheritDoc} */
        public function getRedirectUrl()
        {
                return $this->redirectUrl;
        }
 
-       /**
-        * @return string
-        */
+       /** {@inheritDoc} */
        public function getBody()
        {
                return $this->body;
        }
 
-       /**
-        * @return array
-        */
-       public function getInfo()
-       {
-               return $this->info;
-       }
-
-       /**
-        * @return bool
-        */
+       /** {@inheritDoc} */
        public function isRedirectUrl()
        {
                return $this->isRedirectUrl;
        }
 
-       /**
-        * @return int
-        */
+       /** {@inheritDoc} */
        public function getErrorNumber()
        {
                return $this->errorNumber;
        }
 
-       /**
-        * @return string
-        */
+       /** {@inheritDoc} */
        public function getError()
        {
                return $this->error;
        }
 
-       /**
-        * @return bool
-        */
+       /** {@inheritDoc} */
        public function isTimeout()
        {
                return $this->isTimeout;