mirror of
https://github.com/RSS-Bridge/rss-bridge.git
synced 2025-07-30 21:30:14 +02:00
refactor (#3712)
* test: refactor test suite * docs * refactor * yup * docs
This commit is contained in:
@@ -1,17 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
final class ApiAuthenticationMiddleware
|
||||
{
|
||||
public function __invoke($request): void
|
||||
|
@@ -1,17 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
final class AuthenticationMiddleware
|
||||
{
|
||||
public function __construct()
|
||||
|
@@ -90,17 +90,70 @@ abstract class BridgeAbstract
|
||||
return static::CACHE_TIMEOUT;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the input values for a given context.
|
||||
*
|
||||
* @param array $inputs Associative array of inputs
|
||||
* @param string $queriedContext The context name
|
||||
* @return void
|
||||
*/
|
||||
protected function setInputs(array $inputs, $queriedContext)
|
||||
public function loadConfiguration()
|
||||
{
|
||||
foreach (static::CONFIGURATION as $optionName => $optionValue) {
|
||||
$section = $this->getShortName();
|
||||
$configurationOption = Configuration::getConfig($section, $optionName);
|
||||
|
||||
if ($configurationOption !== null) {
|
||||
$this->configuration[$optionName] = $configurationOption;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($optionValue['required']) && $optionValue['required'] === true) {
|
||||
throw new \Exception(sprintf('Missing configuration option: %s', $optionName));
|
||||
} elseif (isset($optionValue['defaultValue'])) {
|
||||
$this->configuration[$optionName] = $optionValue['defaultValue'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public function setInput(array $input)
|
||||
{
|
||||
$context = $input['context'] ?? null;
|
||||
if ($context) {
|
||||
// Context hinting (optional)
|
||||
$this->queriedContext = $context;
|
||||
unset($input['context']);
|
||||
}
|
||||
|
||||
$parameters = $this->getParameters();
|
||||
|
||||
if (!$parameters) {
|
||||
if ($input) {
|
||||
throw new \Exception('Invalid parameters value(s)');
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
$validator = new ParameterValidator();
|
||||
|
||||
// $input is passed by reference!
|
||||
if (!$validator->validateInput($input, $parameters)) {
|
||||
$invalidParameterKeys = array_column($validator->getInvalidParameters(), 'name');
|
||||
throw new \Exception(sprintf('Invalid parameters value(s): %s', implode(', ', $invalidParameterKeys)));
|
||||
}
|
||||
|
||||
// Guess the context from input data
|
||||
if (empty($this->queriedContext)) {
|
||||
$queriedContext = $validator->getQueriedContext($input, $parameters);
|
||||
$this->queriedContext = $queriedContext;
|
||||
}
|
||||
|
||||
if (is_null($this->queriedContext)) {
|
||||
throw new \Exception('Required parameter(s) missing');
|
||||
} elseif ($this->queriedContext === false) {
|
||||
throw new \Exception('Mixed context parameters');
|
||||
}
|
||||
|
||||
$this->setInputWithContext($input, $this->queriedContext);
|
||||
}
|
||||
|
||||
private function setInputWithContext(array $input, $queriedContext)
|
||||
{
|
||||
// Import and assign all inputs to their context
|
||||
foreach ($inputs as $name => $value) {
|
||||
foreach ($input as $name => $value) {
|
||||
foreach (static::PARAMETERS as $context => $set) {
|
||||
if (array_key_exists($name, static::PARAMETERS[$context])) {
|
||||
$this->inputs[$context][$name]['value'] = $value;
|
||||
@@ -128,7 +181,7 @@ abstract class BridgeAbstract
|
||||
|
||||
switch ($type) {
|
||||
case 'checkbox':
|
||||
$this->inputs[$context][$name]['value'] = $inputs[$context][$name]['value'] ?? false;
|
||||
$this->inputs[$context][$name]['value'] = $input[$context][$name]['value'] ?? false;
|
||||
break;
|
||||
case 'list':
|
||||
if (!isset($properties['defaultValue'])) {
|
||||
@@ -153,8 +206,8 @@ abstract class BridgeAbstract
|
||||
// Copy global parameter values to the guessed context
|
||||
if (array_key_exists('global', static::PARAMETERS)) {
|
||||
foreach (static::PARAMETERS['global'] as $name => $properties) {
|
||||
if (isset($inputs[$name])) {
|
||||
$value = $inputs[$name];
|
||||
if (isset($input[$name])) {
|
||||
$value = $input[$name];
|
||||
} else {
|
||||
if ($properties['type'] ?? null === 'checkbox') {
|
||||
$value = false;
|
||||
@@ -176,91 +229,6 @@ abstract class BridgeAbstract
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set inputs for the bridge
|
||||
*
|
||||
* Returns errors and aborts execution if the provided input parameters are
|
||||
* invalid.
|
||||
*
|
||||
* @param array List of input parameters. Each element in this list must
|
||||
* relate to an item in {@see BridgeAbstract::PARAMETERS}
|
||||
* @return void
|
||||
*/
|
||||
public function setDatas(array $inputs)
|
||||
{
|
||||
if (isset($inputs['context'])) { // Context hinting (optional)
|
||||
$this->queriedContext = $inputs['context'];
|
||||
unset($inputs['context']);
|
||||
}
|
||||
|
||||
if (empty(static::PARAMETERS)) {
|
||||
if (!empty($inputs)) {
|
||||
throw new \Exception('Invalid parameters value(s)');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$validator = new ParameterValidator();
|
||||
|
||||
if (!$validator->validateData($inputs, static::PARAMETERS)) {
|
||||
$parameters = array_map(
|
||||
function ($i) {
|
||||
return $i['name'];
|
||||
}, // Just display parameter names
|
||||
$validator->getInvalidParameters()
|
||||
);
|
||||
|
||||
throw new \Exception(sprintf('Invalid parameters value(s): %s', implode(', ', $parameters)));
|
||||
}
|
||||
|
||||
// Guess the context from input data
|
||||
if (empty($this->queriedContext)) {
|
||||
$this->queriedContext = $validator->getQueriedContext($inputs, static::PARAMETERS);
|
||||
}
|
||||
|
||||
if (is_null($this->queriedContext)) {
|
||||
throw new \Exception('Required parameter(s) missing');
|
||||
} elseif ($this->queriedContext === false) {
|
||||
throw new \Exception('Mixed context parameters');
|
||||
}
|
||||
|
||||
$this->setInputs($inputs, $this->queriedContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads configuration for the bridge
|
||||
*
|
||||
* Returns errors and aborts execution if the provided configuration is
|
||||
* invalid.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function loadConfiguration()
|
||||
{
|
||||
foreach (static::CONFIGURATION as $optionName => $optionValue) {
|
||||
$section = $this->getShortName();
|
||||
$configurationOption = Configuration::getConfig($section, $optionName);
|
||||
|
||||
if ($configurationOption !== null) {
|
||||
$this->configuration[$optionName] = $configurationOption;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($optionValue['required']) && $optionValue['required'] === true) {
|
||||
throw new \Exception(sprintf('Missing configuration option: %s', $optionName));
|
||||
} elseif (isset($optionValue['defaultValue'])) {
|
||||
$this->configuration[$optionName] = $optionValue['defaultValue'];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the value for the provided input
|
||||
*
|
||||
* @param string $input The input name
|
||||
* @return mixed|null The input value or null if the input is not defined
|
||||
*/
|
||||
protected function getInput($input)
|
||||
{
|
||||
return $this->inputs[$this->queriedContext][$input]['value'] ?? null;
|
||||
|
@@ -1,25 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
/**
|
||||
* A generator class for a single bridge card on the home page of RSS-Bridge.
|
||||
*
|
||||
* This class generates the HTML content for a single bridge card for the home
|
||||
* page of RSS-Bridge.
|
||||
*
|
||||
* @todo Return error if a caller creates an object of this class.
|
||||
*/
|
||||
final class BridgeCard
|
||||
{
|
||||
/**
|
||||
|
@@ -4,9 +4,9 @@ final class BridgeFactory
|
||||
{
|
||||
private CacheInterface $cache;
|
||||
private Logger $logger;
|
||||
private $bridgeClassNames = [];
|
||||
private $enabledBridges = [];
|
||||
private $missingEnabledBridges = [];
|
||||
private array $bridgeClassNames = [];
|
||||
private array $enabledBridges = [];
|
||||
private array $missingEnabledBridges = [];
|
||||
|
||||
public function __construct()
|
||||
{
|
||||
@@ -22,7 +22,7 @@ final class BridgeFactory
|
||||
|
||||
$enabledBridges = Configuration::getConfig('system', 'enabled_bridges');
|
||||
if ($enabledBridges === null) {
|
||||
throw new \Exception('No bridges are enabled... wtf?');
|
||||
throw new \Exception('No bridges are enabled...');
|
||||
}
|
||||
foreach ($enabledBridges as $enabledBridge) {
|
||||
if ($enabledBridge === '*') {
|
||||
|
@@ -1,17 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
/**
|
||||
* Configuration module for RSS-Bridge.
|
||||
*
|
||||
|
@@ -1,17 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
/**
|
||||
* An abstract class for bridges that need to transform existing RSS or Atom
|
||||
* feeds.
|
||||
|
@@ -1,17 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
class FormatFactory
|
||||
{
|
||||
private $folder;
|
||||
|
@@ -1,154 +1,21 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
/**
|
||||
* Validator for bridge parameters
|
||||
*/
|
||||
class ParameterValidator
|
||||
{
|
||||
/**
|
||||
* Holds the list of invalid parameters
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $invalid = [];
|
||||
private array $invalid = [];
|
||||
|
||||
/**
|
||||
* Add item to list of invalid parameters
|
||||
* Check that inputs are actually present in the bridge parameters.
|
||||
*
|
||||
* @param string $name The name of the parameter
|
||||
* @param string $reason The reason for that parameter being invalid
|
||||
* @return void
|
||||
* Also check whether input values are allowed.
|
||||
*/
|
||||
private function addInvalidParameter($name, $reason)
|
||||
public function validateInput(&$input, $parameters): bool
|
||||
{
|
||||
$this->invalid[] = [
|
||||
'name' => $name,
|
||||
'reason' => $reason,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Return list of invalid parameters.
|
||||
*
|
||||
* Each element is an array of 'name' and 'reason'.
|
||||
*
|
||||
* @return array List of invalid parameters
|
||||
*/
|
||||
public function getInvalidParameters()
|
||||
{
|
||||
return $this->invalid;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate value for a text input
|
||||
*
|
||||
* @param string $value The value of a text input
|
||||
* @param string|null $pattern (optional) A regex pattern
|
||||
* @return string|null The filtered value or null if the value is invalid
|
||||
*/
|
||||
private function validateTextValue($value, $pattern = null)
|
||||
{
|
||||
if (!is_null($pattern)) {
|
||||
$filteredValue = filter_var(
|
||||
$value,
|
||||
FILTER_VALIDATE_REGEXP,
|
||||
['options' => [
|
||||
'regexp' => '/^' . $pattern . '$/'
|
||||
]
|
||||
]
|
||||
);
|
||||
} else {
|
||||
$filteredValue = filter_var($value);
|
||||
}
|
||||
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $filteredValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate value for a number input
|
||||
*
|
||||
* @param int $value The value of a number input
|
||||
* @return int|null The filtered value or null if the value is invalid
|
||||
*/
|
||||
private function validateNumberValue($value)
|
||||
{
|
||||
$filteredValue = filter_var($value, FILTER_VALIDATE_INT);
|
||||
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $filteredValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate value for a checkbox
|
||||
*
|
||||
* @param bool $value The value of a checkbox
|
||||
* @return bool The filtered value
|
||||
*/
|
||||
private function validateCheckboxValue($value)
|
||||
{
|
||||
return filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Validate value for a list
|
||||
*
|
||||
* @param string $value The value of a list
|
||||
* @param array $expectedValues A list of expected values
|
||||
* @return string|null The filtered value or null if the value is invalid
|
||||
*/
|
||||
private function validateListValue($value, $expectedValues)
|
||||
{
|
||||
$filteredValue = filter_var($value);
|
||||
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (!in_array($filteredValue, $expectedValues)) { // Check sub-values?
|
||||
foreach ($expectedValues as $subName => $subValue) {
|
||||
if (is_array($subValue) && in_array($filteredValue, $subValue)) {
|
||||
return $filteredValue;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
return $filteredValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if all required parameters are satisfied
|
||||
*
|
||||
* @param array $data (ref) A list of input values
|
||||
* @param array $parameters The bridge parameters
|
||||
* @return bool True if all parameters are satisfied
|
||||
*/
|
||||
public function validateData(&$data, $parameters)
|
||||
{
|
||||
if (!is_array($data)) {
|
||||
if (!is_array($input)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
foreach ($data as $name => $value) {
|
||||
foreach ($input as $name => $value) {
|
||||
// Some RSS readers add a cache-busting parameter (_=<timestamp>) to feed URLs, detect and ignore them.
|
||||
if ($name === '_') {
|
||||
continue;
|
||||
@@ -156,54 +23,60 @@ class ParameterValidator
|
||||
|
||||
$registered = false;
|
||||
foreach ($parameters as $context => $set) {
|
||||
if (array_key_exists($name, $set)) {
|
||||
$registered = true;
|
||||
if (!isset($set[$name]['type'])) {
|
||||
$set[$name]['type'] = 'text';
|
||||
}
|
||||
if (!array_key_exists($name, $set)) {
|
||||
continue;
|
||||
}
|
||||
$registered = true;
|
||||
if (!isset($set[$name]['type'])) {
|
||||
// Default type is text
|
||||
$set[$name]['type'] = 'text';
|
||||
}
|
||||
|
||||
switch ($set[$name]['type']) {
|
||||
case 'number':
|
||||
$data[$name] = $this->validateNumberValue($value);
|
||||
break;
|
||||
case 'checkbox':
|
||||
$data[$name] = $this->validateCheckboxValue($value);
|
||||
break;
|
||||
case 'list':
|
||||
$data[$name] = $this->validateListValue($value, $set[$name]['values']);
|
||||
break;
|
||||
default:
|
||||
case 'text':
|
||||
if (isset($set[$name]['pattern'])) {
|
||||
$data[$name] = $this->validateTextValue($value, $set[$name]['pattern']);
|
||||
} else {
|
||||
$data[$name] = $this->validateTextValue($value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
switch ($set[$name]['type']) {
|
||||
case 'number':
|
||||
$input[$name] = $this->validateNumberValue($value);
|
||||
break;
|
||||
case 'checkbox':
|
||||
$input[$name] = $this->validateCheckboxValue($value);
|
||||
break;
|
||||
case 'list':
|
||||
$input[$name] = $this->validateListValue($value, $set[$name]['values']);
|
||||
break;
|
||||
default:
|
||||
case 'text':
|
||||
if (isset($set[$name]['pattern'])) {
|
||||
$input[$name] = $this->validateTextValue($value, $set[$name]['pattern']);
|
||||
} else {
|
||||
$input[$name] = $this->validateTextValue($value);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_null($data[$name]) && isset($set[$name]['required']) && $set[$name]['required']) {
|
||||
$this->addInvalidParameter($name, 'Parameter is invalid!');
|
||||
}
|
||||
if (
|
||||
is_null($input[$name])
|
||||
&& isset($set[$name]['required'])
|
||||
&& $set[$name]['required']
|
||||
) {
|
||||
$this->invalid[] = ['name' => $name, 'reason' => 'Parameter is invalid!'];
|
||||
}
|
||||
}
|
||||
|
||||
if (!$registered) {
|
||||
$this->addInvalidParameter($name, 'Parameter is not registered!');
|
||||
$this->invalid[] = ['name' => $name, 'reason' => 'Parameter is not registered!'];
|
||||
}
|
||||
}
|
||||
|
||||
return empty($this->invalid);
|
||||
return $this->invalid === [];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the context matching the provided inputs
|
||||
*
|
||||
* @param array $data Associative array of user data
|
||||
* @param array $input Associative array of user data
|
||||
* @param array $parameters Array of bridge parameters
|
||||
* @return string|null Returns the context name or null if no match was found
|
||||
*/
|
||||
public function getQueriedContext($data, $parameters)
|
||||
public function getQueriedContext($input, $parameters)
|
||||
{
|
||||
$queriedContexts = [];
|
||||
|
||||
@@ -212,7 +85,7 @@ class ParameterValidator
|
||||
$queriedContexts[$context] = null;
|
||||
|
||||
// Ensure all user data exist in the current context
|
||||
$notInContext = array_diff_key($data, $set);
|
||||
$notInContext = array_diff_key($input, $set);
|
||||
if (array_key_exists('global', $parameters)) {
|
||||
$notInContext = array_diff_key($notInContext, $parameters['global']);
|
||||
}
|
||||
@@ -222,7 +95,7 @@ class ParameterValidator
|
||||
|
||||
// Check if all parameters of the context are satisfied
|
||||
foreach ($set as $id => $properties) {
|
||||
if (isset($data[$id]) && !empty($data[$id])) {
|
||||
if (isset($input[$id]) && !empty($input[$id])) {
|
||||
$queriedContexts[$context] = true;
|
||||
} elseif (
|
||||
isset($properties['type'])
|
||||
@@ -248,8 +121,8 @@ class ParameterValidator
|
||||
switch (array_sum($queriedContexts)) {
|
||||
case 0:
|
||||
// Found no match, is there a context without parameters?
|
||||
if (isset($data['context'])) {
|
||||
return $data['context'];
|
||||
if (isset($input['context'])) {
|
||||
return $input['context'];
|
||||
}
|
||||
foreach ($queriedContexts as $context => $queried) {
|
||||
if (is_null($queried)) {
|
||||
@@ -264,4 +137,55 @@ class ParameterValidator
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public function getInvalidParameters(): array
|
||||
{
|
||||
return $this->invalid;
|
||||
}
|
||||
|
||||
private function validateTextValue($value, $pattern = null)
|
||||
{
|
||||
if (is_null($pattern)) {
|
||||
// No filtering taking place
|
||||
$filteredValue = filter_var($value);
|
||||
} else {
|
||||
$filteredValue = filter_var($value, FILTER_VALIDATE_REGEXP, ['options' => ['regexp' => '/^' . $pattern . '$/']]);
|
||||
}
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
return $filteredValue;
|
||||
}
|
||||
|
||||
private function validateNumberValue($value)
|
||||
{
|
||||
$filteredValue = filter_var($value, FILTER_VALIDATE_INT);
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
return $filteredValue;
|
||||
}
|
||||
|
||||
private function validateCheckboxValue($value)
|
||||
{
|
||||
return filter_var($value, FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE);
|
||||
}
|
||||
|
||||
private function validateListValue($value, $expectedValues)
|
||||
{
|
||||
$filteredValue = filter_var($value);
|
||||
if ($filteredValue === false) {
|
||||
return null;
|
||||
}
|
||||
if (!in_array($filteredValue, $expectedValues)) {
|
||||
// Check sub-values?
|
||||
foreach ($expectedValues as $subName => $subValue) {
|
||||
if (is_array($subValue) && in_array($filteredValue, $subValue)) {
|
||||
return $filteredValue;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return $filteredValue;
|
||||
}
|
||||
}
|
||||
|
@@ -1,18 +1,6 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
/** Path to the formats library */
|
||||
// Path to the formats library
|
||||
const PATH_LIB_FORMATS = __DIR__ . '/../formats/';
|
||||
|
||||
/** Path to the caches library */
|
||||
|
@@ -211,12 +211,12 @@ final class Response
|
||||
}
|
||||
}
|
||||
|
||||
public function getBody()
|
||||
public function getBody(): string
|
||||
{
|
||||
return $this->body;
|
||||
}
|
||||
|
||||
public function getCode()
|
||||
public function getCode(): int
|
||||
{
|
||||
return $this->code;
|
||||
}
|
||||
@@ -226,7 +226,7 @@ final class Response
|
||||
return self::STATUS_CODES[$this->code] ?? '';
|
||||
}
|
||||
|
||||
public function getHeaders()
|
||||
public function getHeaders(): array
|
||||
{
|
||||
return $this->headers;
|
||||
}
|
||||
|
@@ -1,39 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* This file is part of RSS-Bridge, a PHP project capable of generating RSS and
|
||||
* Atom feeds for websites that don't have one.
|
||||
*
|
||||
* For the full license information, please view the UNLICENSE file distributed
|
||||
* with this source code.
|
||||
*
|
||||
* @package Core
|
||||
* @license http://unlicense.org/ UNLICENSE
|
||||
* @link https://github.com/rss-bridge/rss-bridge
|
||||
*/
|
||||
|
||||
// based on https://github.com/laravel/framework/blob/8.x/src/Illuminate/Support/Str.php
|
||||
//
|
||||
// Copyright (c) Taylor Otwell
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
// of this software and associated documentation files (the "Software"), to deal
|
||||
// in the Software without restriction, including without limitation the rights
|
||||
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
// copies of the Software, and to permit persons to whom the Software is furnished
|
||||
// to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included in all
|
||||
// copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
// THE SOFTWARE.
|
||||
|
||||
if (!function_exists('str_starts_with')) {
|
||||
function str_starts_with($haystack, $needle)
|
||||
{
|
||||
|
Reference in New Issue
Block a user