]> git.mxchange.org Git - friendica.git/commitdiff
Caching for fetched activities
authorMichael <heluecht@pirati.ca>
Thu, 28 Jul 2022 19:05:04 +0000 (19:05 +0000)
committerMichael <heluecht@pirati.ca>
Thu, 28 Jul 2022 19:05:04 +0000 (19:05 +0000)
src/Protocol/ActivityPub/Processor.php
src/Protocol/ActivityPub/Receiver.php
src/Util/HTTPSignature.php

index 421f2d4c0c36ba47bb63cdc9428260d6ba0393ab..bfff5f84bb972d479842462b9e683b6091d11287 100644 (file)
@@ -1201,6 +1201,33 @@ class Processor
                Logger::info('Fetched featured posts', ['new' => $new, 'old' => $old, 'contact' => $url]);
        }
 
+       public static function fetchCachedActivity(string $url, int $uid): array
+       {
+               $cachekey = self::CACHEKEY_FETCH_ACTIVITY . $uid . ':' . $url;
+               $object = DI::cache()->get($cachekey);
+
+               if (!is_null($object)) {
+                       Logger::debug('Fetch from cache', ['url' => $url, 'uid' => $uid]);
+                       return $object;
+               }
+
+               $object = ActivityPub::fetchContent($url, $uid);
+               if (empty($object)) {
+                       Logger::notice('Activity was not fetchable, aborting.', ['url' => $url, 'uid' => $uid]);
+                       return [];
+               }
+
+               if (empty($object['id'])) {
+                       Logger::notice('Activity has got not id, aborting. ', ['url' => $url, 'object' => $object]);
+                       return [];
+               }
+               DI::cache()->set($cachekey, $object, Duration::FIVE_MINUTES);
+
+               Logger::debug('Activity was fetched successfully', ['url' => $url, 'uid' => $uid]);
+
+               return $object;
+       }
+
        /**
         * Fetches missing posts
         *
@@ -1220,23 +1247,9 @@ class Processor
                        $uid = 0;
                }
 
-               $cachekey = self::CACHEKEY_FETCH_ACTIVITY . $url;
-               $object = DI::cache()->get($cachekey);
-
-               if (is_null($object)) {
-                       $object = ActivityPub::fetchContent($url, $uid);
-                       if (empty($object)) {
-                               Logger::notice('Activity was not fetchable, aborting.', ['url' => $url, 'uid' => $uid]);
-                               return '';
-                       }
-
-                       if (empty($object['id'])) {
-                               Logger::notice('Activity has got not id, aborting. ', ['url' => $url, 'object' => $object]);
-                               return '';
-                       }
-                       DI::cache()->set($cachekey, $object, Duration::FIVE_MINUTES);
-               } else {
-                       Logger::debug('Fetch from cache', ['url' => $url]);
+               $object = self::fetchCachedActivity($url, $uid);
+               if (empty($object)) {
+                       return '';
                }
 
                $signer = [];
index af6eca61e8ff6a0041fdbbd872dd1d00bc327bf7..f09541b13d715dc60e350cc614416b983f32efd0 100644 (file)
@@ -241,7 +241,7 @@ class Receiver
                        return 'as:' . $profile['type'];
                }
 
-               $data = ActivityPub::fetchContent($object_id, $uid);
+               $data = Processor::fetchCachedActivity($object_id, $uid);
                if (!empty($data)) {
                        $object = JsonLD::compact($data);
                        $type = JsonLD::fetchElement($object, '@type');
@@ -284,7 +284,7 @@ class Receiver
                if (!empty($id) && !$trust_source) {
                        $fetch_uid = $uid ?: self::getBestUserForActivity($activity);
 
-                       $fetched_activity = ActivityPub::fetchContent($fetch_id, $fetch_uid);
+                       $fetched_activity = Processor::fetchCachedActivity($fetch_id, $fetch_uid);
                        if (!empty($fetched_activity)) {
                                $object = JsonLD::compact($fetched_activity);
 
@@ -358,7 +358,7 @@ class Receiver
 
                // Fetch the activity on Lemmy "Announce" messages (announces of activities)
                if (($type == 'as:Announce') && in_array($object_type, array_merge(self::ACTIVITY_TYPES, ['as:Delete', 'as:Undo', 'as:Update']))) {
-                       $data = ActivityPub::fetchContent($object_id, $fetch_uid);
+                       $data = Processor::fetchCachedActivity($object_id, $fetch_uid);
                        if (!empty($data)) {
                                $type = $object_type;
                                $activity = JsonLD::compact($data);
@@ -1273,7 +1273,7 @@ class Receiver
                $type = JsonLD::fetchElement($object, '@type');
 
                if (!$trust_source || empty($type)) {
-                       $data = ActivityPub::fetchContent($object_id, $uid);
+                       $data = Processor::fetchCachedActivity($object_id, $uid);
                        if (!empty($data)) {
                                $object = JsonLD::compact($data);
                                Logger::info('Fetched content for ' . $object_id);
index 9f732acb6e1725aa9bbe5fb3be3ca510b677ea74..f4f0a4e85cc5b48fe9345f73926a18ce5d300871 100644 (file)
@@ -508,7 +508,7 @@ class HTTPSignature
                                return false;
                        }
 
-                       $actor = JsonLD::fetchElement($object, 'actor', 'id');
+                       $actor = JsonLD::fetchElement($object, 'actor', 'id') ?? '';
                } else {
                        $actor = '';
                }