121 lines
3.1 KiB
PHP
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;
|
|
}
|
|
}
|