Fetch local data without HTTP requests

This commit is contained in:
Michael 2021-07-18 18:54:25 +00:00
parent d8bf9c4601
commit 424a85bb94
2 changed files with 39 additions and 18 deletions

View File

@ -31,11 +31,13 @@ use Friendica\DI;
use Friendica\Network\Probe; use Friendica\Network\Probe;
use Friendica\Protocol\ActivityNamespace; use Friendica\Protocol\ActivityNamespace;
use Friendica\Protocol\ActivityPub; use Friendica\Protocol\ActivityPub;
use Friendica\Protocol\ActivityPub\Transmitter;
use Friendica\Util\Crypto; use Friendica\Util\Crypto;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\HTTPSignature; use Friendica\Util\HTTPSignature;
use Friendica\Util\JsonLD; use Friendica\Util\JsonLD;
use Friendica\Util\Network; use Friendica\Util\Network;
use Friendica\Util\Strings;
class APContact class APContact
{ {
@ -161,22 +163,31 @@ class APContact
DI::cache()->set($cachekey, System::callstack(20), Duration::FIVE_MINUTES); DI::cache()->set($cachekey, System::callstack(20), Duration::FIVE_MINUTES);
} }
$curlResult = HTTPSignature::fetchRaw($url); if (Network::isLocalLink($url) && ($local_uid = User::getIdForURL($url))) {
$failed = empty($curlResult) || empty($curlResult->getBody()) || $data = Transmitter::getProfile($local_uid);
(!$curlResult->isSuccess() && ($curlResult->getReturnCode() != 410)); $local_owner = User::getOwnerDataById($local_uid);
if (!$failed) {
$data = json_decode($curlResult->getBody(), true);
$failed = empty($data) || !is_array($data);
} }
if (!$failed && ($curlResult->getReturnCode() == 410)) { if (empty($data)) {
$data = ['@context' => ActivityPub::CONTEXT, 'id' => $url, 'type' => 'Tombstone']; $local_owner = [];
}
if ($failed) { $curlResult = HTTPSignature::fetchRaw($url);
self::markForArchival($fetched_contact ?: []); $failed = empty($curlResult) || empty($curlResult->getBody()) ||
return $fetched_contact; (!$curlResult->isSuccess() && ($curlResult->getReturnCode() != 410));
if (!$failed) {
$data = json_decode($curlResult->getBody(), true);
$failed = empty($data) || !is_array($data);
}
if (!$failed && ($curlResult->getReturnCode() == 410)) {
$data = ['@context' => ActivityPub::CONTEXT, 'id' => $url, 'type' => 'Tombstone'];
}
if ($failed) {
self::markForArchival($fetched_contact ?: []);
return $fetched_contact;
}
} }
$compacted = JsonLD::compact($data); $compacted = JsonLD::compact($data);
@ -267,7 +278,11 @@ class APContact
} }
if (!empty($apcontact['following'])) { if (!empty($apcontact['following'])) {
$following = ActivityPub::fetchContent($apcontact['following']); if (!empty($local_owner)) {
$following = ActivityPub\Transmitter::getContacts($local_owner, [Contact::SHARING, Contact::FRIEND], 'following');
} else {
$following = ActivityPub::fetchContent($apcontact['following']);
}
if (!empty($following['totalItems'])) { if (!empty($following['totalItems'])) {
// Mastodon seriously allows for this condition? // Mastodon seriously allows for this condition?
// Jul 14 2021 - See https://mastodon.social/@BLUW for a negative following count // Jul 14 2021 - See https://mastodon.social/@BLUW for a negative following count
@ -279,7 +294,11 @@ class APContact
} }
if (!empty($apcontact['followers'])) { if (!empty($apcontact['followers'])) {
$followers = ActivityPub::fetchContent($apcontact['followers']); if (!empty($local_owner)) {
$followers = ActivityPub\Transmitter::getContacts($local_owner, [Contact::FOLLOWER, Contact::FRIEND], 'followers');
} else {
$followers = ActivityPub::fetchContent($apcontact['followers']);
}
if (!empty($followers['totalItems'])) { if (!empty($followers['totalItems'])) {
// Mastodon seriously allows for this condition? // Mastodon seriously allows for this condition?
// Jul 14 2021 - See https://mastodon.online/@goes11 for a negative followers count // Jul 14 2021 - See https://mastodon.online/@goes11 for a negative followers count
@ -291,7 +310,11 @@ class APContact
} }
if (!empty($apcontact['outbox'])) { if (!empty($apcontact['outbox'])) {
$outbox = ActivityPub::fetchContent($apcontact['outbox']); if (!empty($local_owner)) {
$outbox = ActivityPub\Transmitter::getOutbox($local_owner);
} else {
$outbox = ActivityPub::fetchContent($apcontact['outbox']);
}
if (!empty($outbox['totalItems'])) { if (!empty($outbox['totalItems'])) {
$apcontact['statuses_count'] = $outbox['totalItems']; $apcontact['statuses_count'] = $outbox['totalItems'];
} }

View File

@ -22,8 +22,6 @@
namespace Friendica\Protocol; namespace Friendica\Protocol;
use Friendica\Core\Protocol; use Friendica\Core\Protocol;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\APContact; use Friendica\Model\APContact;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Util\HTTPSignature; use Friendica\Util\HTTPSignature;