Files
faveo/vendor/itsgoingd/clockwork/Clockwork/Request/ShouldCollect.php
2023-06-08 18:56:00 +05:30

121 lines
3.1 KiB
PHP

<?php namespace Clockwork\Request;
// Filter incoming requests before collecting data
class ShouldCollect
{
// Enable on-demand mode, boolean or the secret value
protected $onDemand = false;
// Enable sampling, chance to be sampled (eg. 100 to collect 1 in 100 requests)
protected $sample = false;
// List of URIs that should not be collected, can contain regexes
protected $except = [];
// List of URIs that should only be collected, can contain regexes (only used if non-empty)
protected $only = [];
// Disable collection of OPTIONS method requests (most commonly used for CORS pre-flight requests)
protected $exceptPreflight = false;
// Custom filter callback
protected $callback;
// Append one or more except URIs
public function except($uris)
{
$this->except = array_merge($this->except, is_array($uris) ? $uris : [ $uris ]);
return $this;
}
// Append one or more only URIs
public function only($uris)
{
$this->only = array_merge($this->only, is_array($uris) ? $uris : [ $uris ]);
return $this;
}
// Merge multiple settings from array
public function merge(array $data = [])
{
foreach ($data as $key => $val) $this->$key = $val;
}
// Apply the filter to an incoming request
public function filter(IncomingRequest $request)
{
return $this->passOnDemand($request)
&& $this->passSampling()
&& $this->passExcept($request)
&& $this->passOnly($request)
&& $this->passExceptPreflight($request)
&& $this->passCallback($request);
}
protected function passOnDemand(IncomingRequest $request)
{
if (! $this->onDemand) return true;
if ($this->onDemand !== true) {
$input = isset($request->input['clockwork-profile']) ? $request->input['clockwork-profile'] : '';
$cookie = isset($request->cookies['clockwork-profile']) ? $request->cookies['clockwork-profile'] : '';
return hash_equals($this->onDemand, $input) || hash_equals($this->onDemand, $cookie);
}
return isset($request->input['clockwork-profile']) || isset($request->cookies['clockwork-profile']);
}
protected function passSampling()
{
if (! $this->sample) return true;
return mt_rand(0, $this->sample) == $this->sample;
}
protected function passExcept(IncomingRequest $request)
{
if (! count($this->except)) return true;
foreach ($this->except as $pattern) {
if (preg_match('#' . str_replace('#', '\#', $pattern) . '#', $request->uri)) return false;
}
return true;
}
protected function passOnly(IncomingRequest $request)
{
if (! count($this->only)) return true;
foreach ($this->only as $pattern) {
if (preg_match('#' . str_replace('#', '\#', $pattern) . '#', $request->uri)) return true;
}
return false;
}
protected function passExceptPreflight(IncomingRequest $request)
{
if (! $this->exceptPreflight) return true;
return strtoupper($request->method) != 'OPTIONS';
}
protected function passCallback(IncomingRequest $request)
{
if (! $this->callback) return true;
return call_user_func($this->callback, $request);
}
public function __call($method, $parameters)
{
if (! count($parameters)) return $this->$method;
$this->$method = count($parameters) ? $parameters[0] : true;
return $this;
}
}