]> git.mxchange.org Git - friendica.git/blobdiff - src/Util/ParseUrl.php
Improved server detection
[friendica.git] / src / Util / ParseUrl.php
index 2763f56abf52aefc8090779b7fca8090906478ab..8d8329675862779ca3cf2e2b2c511bfd07dfeb49 100644 (file)
@@ -29,6 +29,7 @@ use Friendica\Core\Logger;
 use Friendica\Database\Database;
 use Friendica\Database\DBA;
 use Friendica\DI;
+use Friendica\Network\HTTPClient\Client\HttpClientAccept;
 use Friendica\Network\HTTPException;
 use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 
@@ -54,25 +55,34 @@ class ParseUrl
 
        /**
         * Fetch the content type of the given url
-        * @param string $url URL of the page
+        * @param string $url    URL of the page
+        * @param string $accept content-type to accept
+        * @param int    $timeout
         * @return array content type
         */
-       public static function getContentType(string $url)
+       public static function getContentType(string $url, string $accept = HttpClientAccept::DEFAULT, int $timeout = 0)
        {
-               $curlResult = DI::httpClient()->head($url);
+               if (!empty($timeout)) {
+                       $options = [HttpClientOptions::TIMEOUT => $timeout];
+               } else {
+                       $options = [];
+               }
+
+               $curlResult = DI::httpClient()->head($url, array_merge([HttpClientOptions::ACCEPT_CONTENT => $accept], $options));
 
-               // Workaround for systems that can't handle a HEAD request
-               if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() == 405)) {
-                       $curlResult = DI::httpClient()->get($url, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
+               // Workaround for systems that can't handle a HEAD request. Don't retry on timeouts.
+               if (!$curlResult->isSuccess() && ($curlResult->getReturnCode() >= 400) && !in_array($curlResult->getReturnCode(), [408, 504])) {
+                       $curlResult = DI::httpClient()->get($url, $accept, array_merge([HttpClientOptions::CONTENT_LENGTH => 1000000], $options));
                }
 
                if (!$curlResult->isSuccess()) {
+                       Logger::debug('Got HTTP Error', ['http error' => $curlResult->getReturnCode(), 'url' => $url]);
                        return [];
                }
 
                $contenttype =  $curlResult->getHeader('Content-Type')[0] ?? '';
                if (empty($contenttype)) {
-                       return [];
+                       return ['application', 'octet-stream'];
                }
 
                return explode('/', current(explode(';', $contenttype)));
@@ -220,7 +230,7 @@ class ParseUrl
                        return $siteinfo;
                }
 
-               $curlResult = DI::httpClient()->get($url, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
+               $curlResult = DI::httpClient()->get($url, HttpClientAccept::HTML, [HttpClientOptions::CONTENT_LENGTH => 1000000]);
                if (!$curlResult->isSuccess() || empty($curlResult->getBody())) {
                        Logger::info('Empty body or error when fetching', ['url' => $url, 'success' => $curlResult->isSuccess(), 'code' => $curlResult->getReturnCode()]);
                        return $siteinfo;