From 80bd0a4d5a4f63accb4786d37dc488c8141d0cc3 Mon Sep 17 00:00:00 2001 From: Philipp Date: Fri, 9 Oct 2020 22:28:41 +0200 Subject: [PATCH] Fix IHTTPResult::getHeader() - Now returns a string array, like expected - Fix usages - Fix dataset --- src/Content/Text/BBCode.php | 4 +-- src/Model/Photo.php | 5 ++-- src/Model/User.php | 6 ++--- src/Network/CurlResult.php | 10 +++++--- src/Network/IHTTPResult.php | 4 +-- src/Network/Probe.php | 2 +- src/Protocol/OStatus.php | 4 +-- src/Util/Images.php | 18 ++++++++------ src/Util/ParseUrl.php | 8 +++--- tests/datasets/curl/about.head.php | 32 ++++++++++++------------ tests/datasets/curl/about.redirect.php | 34 +++++++++++++------------- 11 files changed, 68 insertions(+), 59 deletions(-) diff --git a/src/Content/Text/BBCode.php b/src/Content/Text/BBCode.php index 594cd9a6ce..5256c3c8ae 100644 --- a/src/Content/Text/BBCode.php +++ b/src/Content/Text/BBCode.php @@ -491,8 +491,8 @@ class BBCode } $i = $curlResult->getBody(); - $type = $curlResult->getContentType(); - $type = Images::getMimeTypeByData($i, $mtch[1], $type); + $contType = $curlResult->getContentType(); + $type = Images::getMimeTypeByData($i, $mtch[1], $contType); if ($i) { $Image = new Image($i, $type); diff --git a/src/Model/Photo.php b/src/Model/Photo.php index 6380f42789..dc60f25f37 100644 --- a/src/Model/Photo.php +++ b/src/Model/Photo.php @@ -424,16 +424,17 @@ class Photo if (!empty($image_url)) { $ret = DI::httpRequest()->get($image_url, true); $img_str = $ret->getBody(); - $type = $ret->getContentType(); + $contType = $ret->getContentType(); } else { $img_str = ''; + $contType = []; } if ($quit_on_error && ($img_str == "")) { return false; } - $type = Images::getMimeTypeByData($img_str, $image_url, $type); + $type = Images::getMimeTypeByData($img_str, $image_url, $contType); $Image = new Image($img_str, $type); if ($Image->isValid()) { diff --git a/src/Model/User.php b/src/Model/User.php index 68c42e40e0..48d9348961 100644 --- a/src/Model/User.php +++ b/src/Model/User.php @@ -1005,13 +1005,13 @@ class User $curlResult = DI::httpRequest()->get($photo, true); if ($curlResult->isSuccess()) { $img_str = $curlResult->getBody(); - $type = $curlResult->getContentType(); + $contType = $curlResult->getContentType(); } else { $img_str = ''; - $type = ''; + $contType = []; } - $type = Images::getMimeTypeByData($img_str, $photo, $type); + $type = Images::getMimeTypeByData($img_str, $photo, $contType); $Image = new Image($img_str, $type); if ($Image->isValid()) { diff --git a/src/Network/CurlResult.php b/src/Network/CurlResult.php index b2eefcbaa9..4ecdd68d10 100644 --- a/src/Network/CurlResult.php +++ b/src/Network/CurlResult.php @@ -245,7 +245,7 @@ class CurlResult implements IHTTPResult public function getHeader($header) { if (empty($header)) { - return ''; + return []; } $header = strtolower(trim($header)); @@ -256,7 +256,7 @@ class CurlResult implements IHTTPResult return $headers[$header]; } - return ''; + return []; } /** {@inheritDoc} */ @@ -289,7 +289,11 @@ class CurlResult implements IHTTPResult $parts = explode(':', $line); $headerfield = strtolower(trim(array_shift($parts))); $headerdata = trim(implode(':', $parts)); - $this->header_fields[$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 $this->header_fields; diff --git a/src/Network/IHTTPResult.php b/src/Network/IHTTPResult.php index 77ee86976b..acee2dde98 100644 --- a/src/Network/IHTTPResult.php +++ b/src/Network/IHTTPResult.php @@ -19,7 +19,7 @@ interface IHTTPResult /** * Returns the Content Type * - * @return string the Content Type + * @return string[] the Content Types */ public function getContentType(); @@ -29,7 +29,7 @@ interface IHTTPResult * * @param string $header optional header field. Return all fields if empty * - * @return string the headers or the specified content of the header variable + * @return string[] the headers or the specified content of the header variable */ public function getHeader($header); diff --git a/src/Network/Probe.php b/src/Network/Probe.php index cfd0368439..14dcdea336 100644 --- a/src/Network/Probe.php +++ b/src/Network/Probe.php @@ -429,7 +429,7 @@ class Probe } // If it isn't a HTML file then exit - if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) { + if (!in_array('html', $curlResult->getContentType())) { return false; } diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index ef38aaebe3..1d95a6f3a4 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -747,7 +747,7 @@ class OStatus $xml = ''; if ($curlResult->inHeader('Content-Type') && - stristr($curlResult->getHeader('Content-Type'), 'application/atom+xml')) { + in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) { $xml = $curlResult->getBody(); } @@ -941,7 +941,7 @@ class OStatus $xml = ''; if ($curlResult->inHeader('Content-Type') && - stristr($curlResult->getHeader('Content-Type'), 'application/atom+xml')) { + in_array('application/atom+xml', $curlResult->getHeader('Content-Type'))) { Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG); $xml = $curlResult->getBody(); } diff --git a/src/Util/Images.php b/src/Util/Images.php index f39b0db00d..f0aefb9f2c 100644 --- a/src/Util/Images.php +++ b/src/Util/Images.php @@ -75,23 +75,25 @@ class Images /** * Fetch image mimetype from the image data or guessing from the file name * - * @param string $image_data Image data - * @param string $filename File name (for guessing the type via the extension) - * @param string $mime default mime type + * @param string $image_data Image data + * @param string $filename File name (for guessing the type via the extension) + * @param string[] $mimeTypes possible mime types * * @return string * @throws \Exception */ - public static function getMimeTypeByData(string $image_data, string $filename = '', string $mime = '') + public static function getMimeTypeByData(string $image_data, string $filename = '', array $mimeTypes = []) { - if (substr($mime, 0, 6) == 'image/') { - Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mime]); - return $mime; + foreach ($mimeTypes as $mimeType) { + if (substr($mimeType, 0, 6) == 'image/') { + Logger::info('Using default mime type', ['filename' => $filename, 'mime' => $mimeTypes]); + return $mimeType; + } } $image = @getimagesizefromstring($image_data); if (!empty($image['mime'])) { - Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mime, 'mime' => $image['mime']]); + Logger::info('Mime type detected via data', ['filename' => $filename, 'default' => $mimeTypes, 'mime' => $image['mime']]); return $image['mime']; } diff --git a/src/Util/ParseUrl.php b/src/Util/ParseUrl.php index 1a81a256ca..ee2bedd1ee 100644 --- a/src/Util/ParseUrl.php +++ b/src/Util/ParseUrl.php @@ -166,7 +166,7 @@ class ParseUrl } // If it isn't a HTML file then exit - if (($curlResult->getContentType() != '') && !strstr(strtolower($curlResult->getContentType()), 'html')) { + if (!in_array('html', $curlResult->getContentType())) { return $siteinfo; } @@ -198,8 +198,10 @@ class ParseUrl $charset = ''; // Look for a charset, first in headers // Expected form: Content-Type: text/html; charset=ISO-8859-4 - if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $curlResult->getContentType(), $matches)) { - $charset = trim(trim(trim(array_pop($matches)), ';,')); + foreach ($curlResult->getContentType() as $type) { + if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $type, $matches)) { + $charset = trim(trim(trim(array_pop($matches)), ';,')); + } } // Then in body that gets precedence diff --git a/tests/datasets/curl/about.head.php b/tests/datasets/curl/about.head.php index d0be0feb4f..b7773b81af 100644 --- a/tests/datasets/curl/about.head.php +++ b/tests/datasets/curl/about.head.php @@ -1,20 +1,20 @@ '', - 'date' => 'Thu, 11 Oct 2018 18:43:54 GMT', - 'content-type' => 'text/html; charset=utf-8', - 'vary' => 'Accept-Encoding', - 'server' => 'Mastodon', - 'x-frame-options' => 'SAMEORIGIN', - 'x-content-type-options' => 'nosniff', - 'x-xss-protection' => '1; mode=block', - 'etag' => 'W/"706e6c48957e1d46ecf9d7597a7880af"', - 'cache-control' => 'max-age=0, private, must-revalidate', - 'set-cookie' => '_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly', - 'x-request-id' => 'a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784', - 'x-runtime' => '0.049566', - 'strict-transport-security' => 'max-age=31536000; includeSubDomains; preload', - 'referrer-policy' => 'same-origin', - 'content-security-policy' => "frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de", + 'http/2 200' => [''], + 'date' => ['Thu, 11 Oct 2018 18:43:54 GMT'], + 'content-type' => ['text/html; charset=utf-8'], + 'vary' => ['Accept-Encoding'], + 'server' => ['Mastodon'], + 'x-frame-options' => ['DENY', 'SAMEORIGIN'], + 'x-content-type-options' => ['nosniff'], + 'x-xss-protection' => ['1; mode=block'], + 'etag' => ['W/"706e6c48957e1d46ecf9d7597a7880af"'], + 'cache-control' => ['max-age=0, private, must-revalidate'], + 'set-cookie' => ['_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly'], + 'x-request-id' => ['a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784'], + 'x-runtime' => ['0.049566'], + 'strict-transport-security' => ['max-age=31536000; includeSubDomains; preload'], + 'referrer-policy' => ['same-origin'], + 'content-security-policy' => ["frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de"], ]; diff --git a/tests/datasets/curl/about.redirect.php b/tests/datasets/curl/about.redirect.php index 5ae3fd88f7..f01689aadc 100644 --- a/tests/datasets/curl/about.redirect.php +++ b/tests/datasets/curl/about.redirect.php @@ -1,21 +1,21 @@ '', - 'date' => 'Thu, 11 Oct 2018 18:43:54 GMT', - 'content-type' => 'text/html; charset=utf-8', - 'vary' => 'Accept-Encoding', - 'server' => 'Mastodon', - 'location' => 'https://test.other/some/', - 'x-frame-options' => 'SAMEORIGIN', - 'x-content-type-options' => 'nosniff', - 'x-xss-protection' => '1; mode=block', - 'etag' => 'W/"706e6c48957e1d46ecf9d7597a7880af"', - 'cache-control' => 'max-age=0, private, must-revalidate', - 'set-cookie' => '_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly', - 'x-request-id' => 'a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784', - 'x-runtime' => '0.049566', - 'strict-transport-security' => 'max-age=31536000; includeSubDomains; preload', - 'referrer-policy' => 'same-origin', - 'content-security-policy' => "frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de", + 'http/2 301' => [''], + 'date' => ['Thu, 11 Oct 2018 18:43:54 GMT'], + 'content-type' => ['text/html; charset=utf-8'], + 'vary' => ['Accept-Encoding'], + 'server' => ['Mastodon'], + 'location' => ['https://test.other/some/'], + 'x-frame-options' => ['DENY', 'SAMEORIGIN'], + 'x-content-type-options' => ['nosniff'], + 'x-xss-protection' => ['1; mode=block'], + 'etag' => ['W/"706e6c48957e1d46ecf9d7597a7880af"'], + 'cache-control' => ['max-age=0, private, must-revalidate'], + 'set-cookie' => ['_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly'], + 'x-request-id' => ['a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784'], + 'x-runtime' => ['0.049566'], + 'strict-transport-security' => ['max-age=31536000; includeSubDomains; preload'], + 'referrer-policy' => ['same-origin'], + 'content-security-policy' => ["frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de"], ];