]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/CurlResult.php
Merge pull request #8277 from MrPetovan/task/8251-use-about-for-pdesc
[friendica.git] / src / Network / CurlResult.php
index b2587799d19bdc9b9bc9ac495cbf428a777b9cec..44263716bce9cb499be52ddd8b8d0a5b09d3a5e1 100644 (file)
@@ -1,4 +1,23 @@
 <?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @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;
 
@@ -26,6 +45,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
         */
@@ -77,6 +101,7 @@ class CurlResult
         * @param string $url optional URL
         *
         * @return CurlResult a CURL with error response
+        * @throws InternalServerErrorException
         */
        public static function createErrorCurl($url = '')
        {
@@ -128,6 +153,7 @@ class CurlResult
 
                $this->body = substr($result, strlen($header));
                $this->header = $header;
+               $this->header_fields = []; // Is filled on demand
        }
 
        private function checkSuccess()
@@ -160,12 +186,22 @@ 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 = [];
+                       }
+
                        if (preg_match('/(Location:|URI:)(.*?)\n/i', $this->header, $matches)) {
-                               $redirect_parts = array_merge($redirect_parts, parse_url(trim(array_pop($matches))));
+                               $redirect_parts2 = parse_url(trim(array_pop($matches)));
+                               if (!empty($redirect_parts2)) {
+                                       $redirect_parts = array_merge($redirect_parts, $redirect_parts2);
+                               }
                        }
 
-                       $parts = parse_url(defaults($this->info, 'url', ''));
+                       $parts = parse_url($this->info['url'] ?? '');
+                       if (empty($parts)) {
+                               $parts = [];
+                       }
 
                        /// @todo Checking the corresponding RFC which parts of a redirect can be ommitted.
                        $components = ['scheme', 'host', 'path', 'query', 'fragment'];
@@ -177,7 +213,7 @@ class CurlResult
 
                        $this->redirectUrl = Network::unparseURL($redirect_parts);
 
-                       $this->isRedirectUrl = filter_var($this->redirectUrl, FILTER_VALIDATE_URL) !== false;
+                       $this->isRedirectUrl = true;
                } else {
                        $this->isRedirectUrl = false;
                }
@@ -215,11 +251,65 @@ class CurlResult
        /**
         * Returns the Curl headers
         *
-        * @return string the Curl headers
+        * @param string $field optional header field. Return all fields if empty
+        *
+        * @return string the Curl headers or the specified content of the header variable
+        */
+       public function getHeader(string $field = '')
+       {
+               if (empty($field)) {
+                       return $this->header;
+               }
+
+               $field = strtolower(trim($field));
+
+               $headers = $this->getHeaderArray();
+
+               if (isset($headers[$field])) {
+                       return $headers[$field];
+               }
+
+               return '';
+       }
+
+       /**
+        * Check if a specified header exists
+        *
+        * @param string $field header field
+        *
+        * @return boolean "true" if header exists
+        */
+       public function inHeader(string $field)
+       {
+               $field = strtolower(trim($field));
+
+               $headers = $this->getHeaderArray();
+
+               return array_key_exists($field, $headers);
+       }
+
+       /**
+        * Returns the Curl headers as an associated array
+        *
+        * @return array associated header array
         */
-       public function getHeader()
+       public function getHeaderArray()
        {
-               return $this->header;
+               if (!empty($this->header_fields)) {
+                       return $this->header_fields;
+               }
+
+               $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));
+                       $this->header_fields[$headerfield] = $headerdata;
+               }
+
+               return $this->header_fields;
        }
 
        /**