X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FCurlResult.php;h=44263716bce9cb499be52ddd8b8d0a5b09d3a5e1;hb=13a10b8f20ac7c5927c39d9e80e1a7d515385736;hp=b2587799d19bdc9b9bc9ac495cbf428a777b9cec;hpb=167ff0eb7124212d6d3ef9fc7902cf482a268c01;p=friendica.git diff --git a/src/Network/CurlResult.php b/src/Network/CurlResult.php index b2587799d1..44263716bc 100644 --- a/src/Network/CurlResult.php +++ b/src/Network/CurlResult.php @@ -1,4 +1,23 @@ . + * + */ 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; } /**