<?php
/**
- * @copyright Copyright (C) 2020, Friendica
+ * @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
*/
class Router
{
- const POST = 'POST';
- const GET = 'GET';
+ const DELETE = 'DELETE';
+ const GET = 'GET';
+ const PATCH = 'PATCH';
+ const POST = 'POST';
+ const PUT = 'PUT';
+ const OPTIONS = 'OPTIONS';
const ALLOWED_METHODS = [
- self::POST,
+ self::DELETE,
self::GET,
+ self::PATCH,
+ self::POST,
+ self::PUT,
+ self::OPTIONS
];
/** @var RouteCollector */
$this->routeCollector = isset($routeCollector) ?
$routeCollector :
new RouteCollector(new Std(), new GroupCountBased());
+
+ if ($this->baseRoutesFilepath && !file_exists($this->baseRoutesFilepath)) {
+ throw new HTTPException\InternalServerErrorException('Routes file path does\'n exist.');
+ }
}
/**
{
$dispatchData = [];
- if ($this->baseRoutesFilepath && file_exists($this->baseRoutesFilepath)) {
+ if ($this->baseRoutesFilepath) {
$dispatchData = require $this->baseRoutesFilepath;
if (!is_array($dispatchData)) {
throw new HTTPException\InternalServerErrorException('Invalid base routes file');
* The cached "routerDispatchData" lasts for a day, and must be cleared manually when there
* is any changes in the enabled addons list.
*
+ * Additionally, we check for the base routes file last modification time to automatically
+ * trigger re-computing the dispatch data.
+ *
* @return array|mixed
* @throws HTTPException\InternalServerErrorException
*/
private function getCachedDispatchData()
{
$routerDispatchData = $this->cache->get('routerDispatchData');
+ $lastRoutesFileModifiedTime = $this->cache->get('lastRoutesFileModifiedTime');
+ $forceRecompute = false;
+
+ if ($this->baseRoutesFilepath) {
+ $routesFileModifiedTime = filemtime($this->baseRoutesFilepath);
+ $forceRecompute = $lastRoutesFileModifiedTime != $routesFileModifiedTime;
+ }
- if ($routerDispatchData) {
+ if (!$forceRecompute && $routerDispatchData) {
return $routerDispatchData;
}
$routerDispatchData = $this->getDispatchData();
$this->cache->set('routerDispatchData', $routerDispatchData, Duration::DAY);
+ if (!empty($routesFileModifiedTime)) {
+ $this->cache->set('lastRoutesFileMtime', $routesFileModifiedTime, Duration::MONTH);
+ }
return $routerDispatchData;
}