From 67e7eabedce709bbb47d0fd68efbd8bbc852fad4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Randy=20=C4=8Cupi=C4=87?= Date: Thu, 24 Oct 2024 21:05:12 +0200 Subject: [PATCH] Use HEAD request instead of md5_file to get etag when missing --- bundle/Resources/config/services/core.yaml | 8 ++- .../Cloudinary/Factory/Md5FileHash.php | 67 +++++++++++++++++++ 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 lib/Core/Provider/Cloudinary/Factory/Md5FileHash.php diff --git a/bundle/Resources/config/services/core.yaml b/bundle/Resources/config/services/core.yaml index 0e4b1ba3..7d590b38 100644 --- a/bundle/Resources/config/services/core.yaml +++ b/bundle/Resources/config/services/core.yaml @@ -72,13 +72,19 @@ services: class: Cloudinary factory: ['@netgen_remote_media.provider.cloudinary.factory.cloudinary_instance', 'create'] + netgen_remote_media.provider.cloudinary.factory.md5_file_hash: + class: Netgen\RemoteMedia\Core\Provider\Cloudinary\Factory\Md5FileHash + public: false + arguments: + - '@netgen_remote_media.factory.md5_file_hash' + netgen_remote_media.provider.cloudinary.factory.remote_resource: class: Netgen\RemoteMedia\Core\Provider\Cloudinary\Factory\RemoteResource public: false arguments: - '@netgen_remote_media.provider.cloudinary.converter.resource_type' - '@netgen_remote_media.provider.cloudinary.converter.visibility_type' - - '@netgen_remote_media.factory.md5_file_hash' + - '@netgen_remote_media.provider.cloudinary.factory.md5_file_hash' netgen_remote_media.provider.cloudinary.factory.search_result: class: Netgen\RemoteMedia\Core\Provider\Cloudinary\Factory\SearchResult diff --git a/lib/Core/Provider/Cloudinary/Factory/Md5FileHash.php b/lib/Core/Provider/Cloudinary/Factory/Md5FileHash.php new file mode 100644 index 00000000..d89c0be8 --- /dev/null +++ b/lib/Core/Provider/Cloudinary/Factory/Md5FileHash.php @@ -0,0 +1,67 @@ +getUsingHead($path) ?? $this->fileHashFactory->createHash($path); + } + + private function getUsingHead(string $path): ?string + { + $ch = curl_init($path); + $headers = []; + + curl_setopt($ch, CURLOPT_NOBODY, true); + curl_setopt( + $ch, + CURLOPT_HEADERFUNCTION, + static function ($curl, $header) use (&$headers) { + $len = mb_strlen($header); + $header = explode(':', $header, 2); + if (count($header) < 2) { + return $len; + } + + $headers[mb_strtolower(trim($header[0]))][] = trim($header[1]); + + return $len; + }, + ); + + $status = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + + curl_close($ch); + + if ($status !== true || $code !== Response::HTTP_OK) { + return null; + } + + return ($headers['etag'][0] ?? null) ? trim($headers['etag'][0], ' "\'\t\n\r\0\v') : null; + } +}