use FastRoute\Dispatcher;
use FastRoute\RouteCollector;
use FastRoute\RouteParser\Std;
-use Friendica\Core\Cache\Duration;
-use Friendica\Core\Cache\ICache;
+use Friendica\Core\Cache\Enum\Duration;
+use Friendica\Core\Cache\Capability\ICanCache;
use Friendica\Core\Hook;
use Friendica\Core\L10n;
+use Friendica\Core\Lock\Capability\ICanLock;
use Friendica\Network\HTTPException;
/**
/** @var L10n */
private $l10n;
- /** @var ICache */
+ /** @var ICanCache */
private $cache;
+ /** @var ICanLock */
+ private $lock;
+
/** @var string */
private $baseRoutesFilepath;
* @param array $server The $_SERVER variable
* @param string $baseRoutesFilepath The path to a base routes file to leverage cache, can be empty
* @param L10n $l10n
- * @param ICache $cache
+ * @param ICanCache $cache
* @param RouteCollector|null $routeCollector
*/
- public function __construct(array $server, string $baseRoutesFilepath, L10n $l10n, ICache $cache, RouteCollector $routeCollector = null)
+ public function __construct(array $server, string $baseRoutesFilepath, L10n $l10n, ICanCache $cache, ICanLock $lock, RouteCollector $routeCollector = null)
{
$this->baseRoutesFilepath = $baseRoutesFilepath;
$this->l10n = $l10n;
$this->cache = $cache;
+ $this->lock = $lock;
$httpMethod = $server['REQUEST_METHOD'] ?? self::GET;
$this->httpMethod = in_array($httpMethod, self::ALLOWED_METHODS) ? $httpMethod : self::GET;
return $routerDispatchData;
}
+ if (!$this->lock->acquire('getCachedDispatchData', 0)) {
+ // Immediately return uncached data when we can't aquire a lock
+ return $this->getDispatchData();
+ }
+
$routerDispatchData = $this->getDispatchData();
$this->cache->set('routerDispatchData', $routerDispatchData, Duration::DAY);
if (!empty($routesFileModifiedTime)) {
- $this->cache->set('lastRoutesFileMtime', $routesFileModifiedTime, Duration::MONTH);
+ $this->cache->set('lastRoutesFileModifiedTime', $routesFileModifiedTime, Duration::MONTH);
+ }
+
+ if ($this->lock->isLocked('getCachedDispatchData')) {
+ $this->lock->release('getCachedDispatchData');
}
return $routerDispatchData;