From a1dcd57a925834b1a0f965520b51d7f4415b6039 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 30 Aug 2025 06:59:02 +0000 Subject: [PATCH] Only request a small range when fetching HTTP information --- src/Model/Post/Media.php | 8 +++++--- src/Util/ParseUrl.php | 4 ++-- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Model/Post/Media.php b/src/Model/Post/Media.php index bd10f03705..5ee197c075 100644 --- a/src/Model/Post/Media.php +++ b/src/Model/Post/Media.php @@ -193,16 +193,18 @@ class Media $timeout = DI::config()->get('system', 'xrd_timeout'); try { $curlResult = DI::httpClient()->head($media['url'], [HttpClientOptions::ACCEPT_CONTENT => HttpClientAccept::AS_DEFAULT, HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE]); + $is_head = true; // Workaround for systems that can't handle a HEAD request if (!$curlResult->isSuccess() && in_array($curlResult->getReturnCode(), [400, 403, 405])) { - $curlResult = DI::httpClient()->get($media['url'], HttpClientAccept::AS_DEFAULT, [HttpClientOptions::TIMEOUT => $timeout]); + $curlResult = DI::httpClient()->get($media['url'], HttpClientAccept::AS_DEFAULT, [HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::HEADERS => ['Range' => 'bytes=0-100000']]); + $is_head = false; } if ($curlResult->isSuccess()) { if (!empty($curlResult->getContentType())) { $media['mimetype'] = $curlResult->getContentType(); } - if (empty($media['size'])) { + if (empty($media['size']) && $is_head) { $media['size'] = (int)($curlResult->getHeader('Content-Length')[0] ?? strlen($curlResult->getBodyString() ?? '')); } if (empty($media['modified']) && !empty($curlResult->getHeader('Last-Modified')[0])) { @@ -277,7 +279,7 @@ class Media } return DBA::exists('gserver', ['nurl' => Strings::normaliseLink($baseurl), 'network' => Protocol::FEDERATED]); - } catch(\Throwable $e) { + } catch (\Throwable $e) { DI::logger()->notice('Invalid URL provided', ['url' => $url, 'exception' => $e, 'callstack' => System::callstack(10)]); return false; } diff --git a/src/Util/ParseUrl.php b/src/Util/ParseUrl.php index ad50269186..f4f290cc69 100644 --- a/src/Util/ParseUrl.php +++ b/src/Util/ParseUrl.php @@ -50,9 +50,9 @@ class ParseUrl public static function getContentType(string $url, string $accept = HttpClientAccept::DEFAULT, int $timeout = 0): array { if (!empty($timeout)) { - $options = [HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE]; + $options = [HttpClientOptions::TIMEOUT => $timeout, HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE, HttpClientOptions::HEADERS => ['Range' => 'bytes=0-100000']]; } else { - $options = [HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE]; + $options = [HttpClientOptions::REQUEST => HttpClientRequest::CONTENTTYPE, HttpClientOptions::HEADERS => ['Range' => 'bytes=0-100000']]; } try {