JEMBOT MAWOT Bypass Shell
<?php
declare(strict_types=1);
namespace Sentry;
use Sentry\Integration\ErrorListenerIntegration;
use Sentry\Integration\IntegrationInterface;
use Symfony\Component\OptionsResolver\Options as SymfonyOptions;
use Symfony\Component\OptionsResolver\OptionsResolver;
/**
* Configuration container for the Sentry client.
*
* @author Stefano Arlandini <sarlandini@alice.it>
*/
final class Options
{
/**
* The default maximum number of breadcrumbs that will be sent with an
* event.
*/
public const DEFAULT_MAX_BREADCRUMBS = 100;
/**
* The default maximum execution time in seconds for the request+response
* as a whole.
*/
public const DEFAULT_HTTP_TIMEOUT = 5;
/**
* The default maximum number of seconds to wait while trying to connect to a
* server.
*/
public const DEFAULT_HTTP_CONNECT_TIMEOUT = 2;
/**
* @var array<string, mixed> The configuration options
*/
private $options;
/**
* @var OptionsResolver The options resolver
*/
private $resolver;
/**
* Class constructor.
*
* @param array<string, mixed> $options The configuration options
*/
public function __construct(array $options = [])
{
$this->resolver = new OptionsResolver();
$this->configureOptions($this->resolver);
$this->options = $this->resolver->resolve($options);
if (true === $this->options['enable_tracing'] && null === $this->options['traces_sample_rate']) {
$this->options = array_merge($this->options, ['traces_sample_rate' => 1]);
}
}
/**
* Gets the number of attempts to resend an event that failed to be sent.
*
* @deprecated since version 3.5, to be removed in 4.0
*/
public function getSendAttempts(/*bool $triggerDeprecation = true*/): int
{
if (0 === \func_num_args() || false !== func_get_arg(0)) {
@trigger_error(sprintf('Method %s() is deprecated since version 3.5 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
}
return $this->options['send_attempts'];
}
/**
* Sets the number of attempts to resend an event that failed to be sent.
*
* @param int $attemptsCount The number of attempts
*
* @deprecated since version 3.5, to be removed in 4.0
*/
public function setSendAttempts(int $attemptsCount): void
{
@trigger_error(sprintf('Method %s() is deprecated since version 3.5 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
$options = array_merge($this->options, ['send_attempts' => $attemptsCount]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the prefixes which should be stripped from filenames to create
* relative paths.
*
* @return string[]
*/
public function getPrefixes(): array
{
return $this->options['prefixes'];
}
/**
* Sets the prefixes which should be stripped from filenames to create
* relative paths.
*
* @param string[] $prefixes The prefixes
*/
public function setPrefixes(array $prefixes): void
{
$options = array_merge($this->options, ['prefixes' => $prefixes]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the sampling factor to apply to events. A value of 0 will deny
* sending any events, and a value of 1 will send 100% of events.
*/
public function getSampleRate(): float
{
return $this->options['sample_rate'];
}
/**
* Sets the sampling factor to apply to events. A value of 0 will deny
* sending any events, and a value of 1 will send 100% of events.
*
* @param float $sampleRate The sampling factor
*/
public function setSampleRate(float $sampleRate): void
{
$options = array_merge($this->options, ['sample_rate' => $sampleRate]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the sampling factor to apply to transaction. A value of 0 will deny
* sending any transaction, and a value of 1 will send 100% of transaction.
*/
public function getTracesSampleRate(): ?float
{
return $this->options['traces_sample_rate'];
}
/**
* Sets if tracing should be enabled or not. If null tracesSampleRate takes
* precedence.
*
* @param bool|null $enableTracing Boolean if tracing should be enabled or not
*/
public function setEnableTracing(?bool $enableTracing): void
{
$options = array_merge($this->options, ['enable_tracing' => $enableTracing]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets if tracing is enabled or not.
*
* @return bool|null If the option `enable_tracing` is set or not
*/
public function getEnableTracing(): ?bool
{
return $this->options['enable_tracing'];
}
/**
* Sets the sampling factor to apply to transactions. A value of 0 will deny
* sending any transactions, and a value of 1 will send 100% of transactions.
*
* @param ?float $sampleRate The sampling factor
*/
public function setTracesSampleRate(?float $sampleRate): void
{
$options = array_merge($this->options, ['traces_sample_rate' => $sampleRate]);
$this->options = $this->resolver->resolve($options);
}
public function getProfilesSampleRate(): ?float
{
/** @var int|float|null $value */
$value = $this->options['profiles_sample_rate'] ?? null;
return $value ?? null;
}
public function setProfilesSampleRate(?float $sampleRate): void
{
$options = array_merge($this->options, ['profiles_sample_rate' => $sampleRate]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets whether tracing is enabled or not. The feature is enabled when at
* least one of the `traces_sample_rate` and `traces_sampler` options is
* set and `enable_tracing` is set and not false.
*/
public function isTracingEnabled(): bool
{
if (null !== $this->getEnableTracing() && false === $this->getEnableTracing()) {
return false;
}
return null !== $this->getTracesSampleRate() || null !== $this->getTracesSampler();
}
/**
* Gets whether the stacktrace will be attached on captureMessage.
*/
public function shouldAttachStacktrace(): bool
{
return $this->options['attach_stacktrace'];
}
/**
* Sets whether the stacktrace will be attached on captureMessage.
*
* @param bool $enable Flag indicating if the stacktrace will be attached to captureMessage calls
*/
public function setAttachStacktrace(bool $enable): void
{
$options = array_merge($this->options, ['attach_stacktrace' => $enable]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the number of lines of code context to capture, or null if none.
*/
public function getContextLines(): ?int
{
return $this->options['context_lines'];
}
/**
* Sets the number of lines of code context to capture, or null if none.
*
* @param int|null $contextLines The number of lines of code
*/
public function setContextLines(?int $contextLines): void
{
$options = array_merge($this->options, ['context_lines' => $contextLines]);
$this->options = $this->resolver->resolve($options);
}
/**
* Returns whether the requests should be compressed using GZIP or not.
*/
public function isCompressionEnabled(): bool
{
return $this->options['enable_compression'];
}
/**
* Sets whether the request should be compressed using JSON or not.
*
* @param bool $enabled Flag indicating whether the request should be compressed
*/
public function setEnableCompression(bool $enabled): void
{
$options = array_merge($this->options, ['enable_compression' => $enabled]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the environment.
*/
public function getEnvironment(): ?string
{
return $this->options['environment'];
}
/**
* Sets the environment.
*
* @param string|null $environment The environment
*/
public function setEnvironment(?string $environment): void
{
$options = array_merge($this->options, ['environment' => $environment]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the list of paths to exclude from in_app detection.
*
* @return string[]
*/
public function getInAppExcludedPaths(): array
{
return $this->options['in_app_exclude'];
}
/**
* Sets the list of paths to exclude from in_app detection.
*
* @param string[] $paths The list of paths
*/
public function setInAppExcludedPaths(array $paths): void
{
$options = array_merge($this->options, ['in_app_exclude' => $paths]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the list of paths which has to be identified as in_app.
*
* @return string[]
*/
public function getInAppIncludedPaths(): array
{
return $this->options['in_app_include'];
}
/**
* Set the list of paths to include in in_app detection.
*
* @param string[] $paths The list of paths
*/
public function setInAppIncludedPaths(array $paths): void
{
$options = array_merge($this->options, ['in_app_include' => $paths]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the logger used by Sentry.
*
* @deprecated since version 3.2, to be removed in 4.0
*/
public function getLogger(/*bool $triggerDeprecation = true*/): string
{
if (0 === \func_num_args() || false !== func_get_arg(0)) {
@trigger_error(sprintf('Method %s() is deprecated since version 3.2 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
}
return $this->options['logger'];
}
/**
* Sets the logger used by Sentry.
*
* @param string $logger The logger
*
* @deprecated since version 3.2, to be removed in 4.0
*/
public function setLogger(string $logger): void
{
@trigger_error(sprintf('Method %s() is deprecated since version 3.2 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
$options = array_merge($this->options, ['logger' => $logger]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the release tag to be passed with every event sent to Sentry.
*
* @return string
*/
public function getRelease(): ?string
{
return $this->options['release'];
}
/**
* Sets the release tag to be passed with every event sent to Sentry.
*
* @param string|null $release The release
*/
public function setRelease(?string $release): void
{
$options = array_merge($this->options, ['release' => $release]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the DSN of the Sentry server the authenticated user is bound to.
*/
public function getDsn(): ?Dsn
{
return $this->options['dsn'];
}
/**
* Gets the name of the server the SDK is running on (e.g. the hostname).
*/
public function getServerName(): string
{
return $this->options['server_name'];
}
/**
* Sets the name of the server the SDK is running on (e.g. the hostname).
*
* @param string $serverName The server name
*/
public function setServerName(string $serverName): void
{
$options = array_merge($this->options, ['server_name' => $serverName]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a list of exceptions to be ignored and not sent to Sentry.
*
* @return string[]
*/
public function getIgnoreExceptions(): array
{
return $this->options['ignore_exceptions'];
}
/**
* Sets a list of exceptions to be ignored and not sent to Sentry.
*
* @param string[] $ignoreErrors The list of exceptions to be ignored
*/
public function setIgnoreExceptions(array $ignoreErrors): void
{
$options = array_merge($this->options, ['ignore_exceptions' => $ignoreErrors]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a list of transaction names to be ignored and not sent to Sentry.
*
* @return string[]
*/
public function getIgnoreTransactions(): array
{
return $this->options['ignore_transactions'];
}
/**
* Sets a list of transaction names to be ignored and not sent to Sentry.
*
* @param string[] $ignoreTransaction The list of transaction names to be ignored
*/
public function setIgnoreTransactions(array $ignoreTransaction): void
{
$options = array_merge($this->options, ['ignore_transactions' => $ignoreTransaction]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a callback that will be invoked before an event is sent to the server.
* If `null` is returned it won't be sent.
*
* @psalm-return callable(Event, ?EventHint): ?Event
*/
public function getBeforeSendCallback(): callable
{
return $this->options['before_send'];
}
/**
* Sets a callable to be called to decide whether an event should
* be captured or not.
*
* @param callable $callback The callable
*
* @psalm-param callable(Event, ?EventHint): ?Event $callback
*/
public function setBeforeSendCallback(callable $callback): void
{
$options = array_merge($this->options, ['before_send' => $callback]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a callback that will be invoked before an transaction is sent to the server.
* If `null` is returned it won't be sent.
*
* @psalm-return callable(Event, ?EventHint): ?Event
*/
public function getBeforeSendTransactionCallback(): callable
{
return $this->options['before_send_transaction'];
}
/**
* Sets a callable to be called to decide whether an transaction should
* be captured or not.
*
* @param callable $callback The callable
*
* @psalm-param callable(Event, ?EventHint): ?Event $callback
*/
public function setBeforeSendTransactionCallback(callable $callback): void
{
$options = array_merge($this->options, ['before_send_transaction' => $callback]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets an allow list of trace propagation targets.
*
* @return string[]
*/
public function getTracePropagationTargets(): array
{
return $this->options['trace_propagation_targets'];
}
/**
* Set an allow list of trace propagation targets.
*
* @param string[] $tracePropagationTargets Trace propagation targets
*/
public function setTracePropagationTargets(array $tracePropagationTargets): void
{
$options = array_merge($this->options, ['trace_propagation_targets' => $tracePropagationTargets]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a list of default tags for events.
*
* @return array<string, string>
*
* @deprecated since version 3.2, to be removed in 4.0
*/
public function getTags(/*bool $triggerDeprecation = true*/): array
{
if (0 === \func_num_args() || false !== func_get_arg(0)) {
@trigger_error(sprintf('Method %s() is deprecated since version 3.2 and will be removed in 4.0.', __METHOD__), \E_USER_DEPRECATED);
}
return $this->options['tags'];
}
/**
* Sets a list of default tags for events.
*
* @param array<string, string> $tags A list of tags
*
* @deprecated since version 3.2, to be removed in 4.0
*/
public function setTags(array $tags): void
{
@trigger_error(sprintf('Method %s() is deprecated since version 3.2 and will be removed in 4.0. Use Sentry\\Scope::setTags() instead.', __METHOD__), \E_USER_DEPRECATED);
$options = array_merge($this->options, ['tags' => $tags]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a bit mask for error_reporting used in {@link ErrorListenerIntegration} to filter which errors to report.
*/
public function getErrorTypes(): int
{
return $this->options['error_types'] ?? error_reporting();
}
/**
* Sets a bit mask for error_reporting used in {@link ErrorListenerIntegration} to filter which errors to report.
*
* @param int $errorTypes The bit mask
*/
public function setErrorTypes(int $errorTypes): void
{
$options = array_merge($this->options, ['error_types' => $errorTypes]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the maximum number of breadcrumbs sent with events.
*/
public function getMaxBreadcrumbs(): int
{
return $this->options['max_breadcrumbs'];
}
/**
* Sets the maximum number of breadcrumbs sent with events.
*
* @param int $maxBreadcrumbs The maximum number of breadcrumbs
*/
public function setMaxBreadcrumbs(int $maxBreadcrumbs): void
{
$options = array_merge($this->options, ['max_breadcrumbs' => $maxBreadcrumbs]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a callback that will be invoked when adding a breadcrumb.
*
* @psalm-return callable(Breadcrumb): ?Breadcrumb
*/
public function getBeforeBreadcrumbCallback(): callable
{
return $this->options['before_breadcrumb'];
}
/**
* Sets a callback that will be invoked when adding a breadcrumb, allowing
* to optionally modify it before adding it to future events. Note that you
* must return a valid breadcrumb from this callback. If you do not wish to
* modify the breadcrumb, simply return it at the end. Returning `null` will
* cause the breadcrumb to be dropped.
*
* @param callable $callback The callback
*
* @psalm-param callable(Breadcrumb): ?Breadcrumb $callback
*/
public function setBeforeBreadcrumbCallback(callable $callback): void
{
$options = array_merge($this->options, ['before_breadcrumb' => $callback]);
$this->options = $this->resolver->resolve($options);
}
/**
* Sets the list of integrations that should be installed after SDK was
* initialized or a function that receives default integrations and returns
* a new, updated list.
*
* @param IntegrationInterface[]|callable(IntegrationInterface[]): IntegrationInterface[] $integrations The list or callable
*/
public function setIntegrations($integrations): void
{
$options = array_merge($this->options, ['integrations' => $integrations]);
$this->options = $this->resolver->resolve($options);
}
/**
* Returns all configured integrations that will be used by the Client.
*
* @return IntegrationInterface[]|callable(IntegrationInterface[]): IntegrationInterface[]
*/
public function getIntegrations()
{
return $this->options['integrations'];
}
/**
* Should default PII be sent by default.
*/
public function shouldSendDefaultPii(): bool
{
return $this->options['send_default_pii'];
}
/**
* Sets if default PII should be sent with every event (if possible).
*
* @param bool $enable Flag indicating if default PII will be sent
*/
public function setSendDefaultPii(bool $enable): void
{
$options = array_merge($this->options, ['send_default_pii' => $enable]);
$this->options = $this->resolver->resolve($options);
}
/**
* Returns whether the default integrations are enabled.
*/
public function hasDefaultIntegrations(): bool
{
return $this->options['default_integrations'];
}
/**
* Sets whether the default integrations are enabled.
*
* @param bool $enable Flag indicating whether the default integrations should be enabled
*/
public function setDefaultIntegrations(bool $enable): void
{
$options = array_merge($this->options, ['default_integrations' => $enable]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the max length for values in the event payload.
*/
public function getMaxValueLength(): int
{
return $this->options['max_value_length'];
}
/**
* Sets the max length for specific values in the event payload.
*
* @param int $maxValueLength The number of characters after which the values containing text will be truncated
*/
public function setMaxValueLength(int $maxValueLength): void
{
$options = array_merge($this->options, ['max_value_length' => $maxValueLength]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the http proxy setting.
*/
public function getHttpProxy(): ?string
{
return $this->options['http_proxy'];
}
/**
* Sets the http proxy. Be aware this option only works when curl client is used.
*
* @param string|null $httpProxy The http proxy
*/
public function setHttpProxy(?string $httpProxy): void
{
$options = array_merge($this->options, ['http_proxy' => $httpProxy]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the maximum number of seconds to wait while trying to connect to a server.
*/
public function getHttpConnectTimeout(): float
{
return $this->options['http_connect_timeout'];
}
/**
* Sets the maximum number of seconds to wait while trying to connect to a server.
*
* @param float $httpConnectTimeout The amount of time in seconds
*/
public function setHttpConnectTimeout(float $httpConnectTimeout): void
{
$options = array_merge($this->options, ['http_connect_timeout' => $httpConnectTimeout]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the maximum execution time for the request+response as a whole.
*/
public function getHttpTimeout(): float
{
return $this->options['http_timeout'];
}
/**
* Sets the maximum execution time for the request+response as a whole. The
* value should also include the time for the connect phase, so it should be
* greater than the value set for the `http_connect_timeout` option.
*
* @param float $httpTimeout The amount of time in seconds
*/
public function setHttpTimeout(float $httpTimeout): void
{
$options = array_merge($this->options, ['http_timeout' => $httpTimeout]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets whether the silenced errors should be captured or not.
*
* @return bool If true, errors silenced through the @ operator will be reported,
* ignored otherwise
*/
public function shouldCaptureSilencedErrors(): bool
{
return $this->options['capture_silenced_errors'];
}
/**
* Sets whether the silenced errors should be captured or not.
*
* @param bool $shouldCapture If set to true, errors silenced through the @
* operator will be reported, ignored otherwise
*/
public function setCaptureSilencedErrors(bool $shouldCapture): void
{
$options = array_merge($this->options, ['capture_silenced_errors' => $shouldCapture]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the limit up to which integrations should capture the HTTP request
* body.
*/
public function getMaxRequestBodySize(): string
{
return $this->options['max_request_body_size'];
}
/**
* Sets the limit up to which integrations should capture the HTTP request
* body.
*
* @param string $maxRequestBodySize The limit up to which request body are
* captured. It can be set to one of the
* following values:
*
* - none: request bodies are never sent
* - small: only small request bodies will
* be captured where the cutoff for small
* depends on the SDK (typically 4KB)
* - medium: medium-sized requests and small
* requests will be captured. (typically 10KB)
* - always: the SDK will always capture the
* request body for as long as sentry can
* make sense of it
*/
public function setMaxRequestBodySize(string $maxRequestBodySize): void
{
$options = array_merge($this->options, ['max_request_body_size' => $maxRequestBodySize]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets the callbacks used to customize how objects are serialized in the payload
* of the event.
*
* @return array<string, callable>
*/
public function getClassSerializers(): array
{
return $this->options['class_serializers'];
}
/**
* Sets a list of callables that will be called to customize how objects are
* serialized in the event's payload. The list must be a map of FQCN/callable
* pairs.
*
* @param array<string, callable> $serializers The list of serializer callbacks
*/
public function setClassSerializers(array $serializers): void
{
$options = array_merge($this->options, ['class_serializers' => $serializers]);
$this->options = $this->resolver->resolve($options);
}
/**
* Gets a callback that will be invoked when we sample a Transaction.
*
* @psalm-return null|callable(\Sentry\Tracing\SamplingContext): float
*/
public function getTracesSampler(): ?callable
{
return $this->options['traces_sampler'];
}
/**
* Sets a callback that will be invoked when we take the sampling decision for Transactions.
* Return a number between 0 and 1 to define the sample rate for the provided SamplingContext.
*
* @param ?callable $sampler The sampler
*
* @psalm-param null|callable(\Sentry\Tracing\SamplingContext): float $sampler
*/
public function setTracesSampler(?callable $sampler): void
{
$options = array_merge($this->options, ['traces_sampler' => $sampler]);
$this->options = $this->resolver->resolve($options);
}
/**
* Configures the options of the client.
*
* @param OptionsResolver $resolver The resolver for the options
*
* @throws \Symfony\Component\OptionsResolver\Exception\UndefinedOptionsException
* @throws \Symfony\Component\OptionsResolver\Exception\AccessException
*/
private function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'integrations' => [],
'default_integrations' => true,
'send_attempts' => 0,
'prefixes' => array_filter(explode(\PATH_SEPARATOR, get_include_path() ?: '')),
'sample_rate' => 1,
'enable_tracing' => null,
'traces_sample_rate' => null,
'traces_sampler' => null,
'profiles_sample_rate' => null,
'attach_stacktrace' => false,
'context_lines' => 5,
'enable_compression' => true,
'environment' => $_SERVER['SENTRY_ENVIRONMENT'] ?? null,
'logger' => 'php',
'release' => $_SERVER['SENTRY_RELEASE'] ?? null,
'dsn' => $_SERVER['SENTRY_DSN'] ?? null,
'server_name' => gethostname(),
'ignore_exceptions' => [],
'ignore_transactions' => [],
'before_send' => static function (Event $event): Event {
return $event;
},
'before_send_transaction' => static function (Event $transaction): Event {
return $transaction;
},
'trace_propagation_targets' => [],
'tags' => [],
'error_types' => null,
'max_breadcrumbs' => self::DEFAULT_MAX_BREADCRUMBS,
'before_breadcrumb' => static function (Breadcrumb $breadcrumb): Breadcrumb {
return $breadcrumb;
},
'in_app_exclude' => [],
'in_app_include' => [],
'send_default_pii' => false,
'max_value_length' => 1024,
'http_proxy' => null,
'http_connect_timeout' => self::DEFAULT_HTTP_CONNECT_TIMEOUT,
'http_timeout' => self::DEFAULT_HTTP_TIMEOUT,
'capture_silenced_errors' => false,
'max_request_body_size' => 'medium',
'class_serializers' => [],
]);
$resolver->setAllowedTypes('send_attempts', 'int');
$resolver->setAllowedTypes('prefixes', 'string[]');
$resolver->setAllowedTypes('sample_rate', ['int', 'float']);
$resolver->setAllowedTypes('enable_tracing', ['null', 'bool']);
$resolver->setAllowedTypes('traces_sample_rate', ['null', 'int', 'float']);
$resolver->setAllowedTypes('traces_sampler', ['null', 'callable']);
$resolver->setAllowedTypes('profiles_sample_rate', ['null', 'int', 'float']);
$resolver->setAllowedTypes('attach_stacktrace', 'bool');
$resolver->setAllowedTypes('context_lines', ['null', 'int']);
$resolver->setAllowedTypes('enable_compression', 'bool');
$resolver->setAllowedTypes('environment', ['null', 'string']);
$resolver->setAllowedTypes('in_app_exclude', 'string[]');
$resolver->setAllowedTypes('in_app_include', 'string[]');
$resolver->setAllowedTypes('logger', ['null', 'string']);
$resolver->setAllowedTypes('release', ['null', 'string']);
$resolver->setAllowedTypes('dsn', ['null', 'string', 'bool', Dsn::class]);
$resolver->setAllowedTypes('server_name', 'string');
$resolver->setAllowedTypes('before_send', ['callable']);
$resolver->setAllowedTypes('before_send_transaction', ['callable']);
$resolver->setAllowedTypes('ignore_exceptions', 'string[]');
$resolver->setAllowedTypes('ignore_transactions', 'string[]');
$resolver->setAllowedTypes('trace_propagation_targets', 'string[]');
$resolver->setAllowedTypes('tags', 'string[]');
$resolver->setAllowedTypes('error_types', ['null', 'int']);
$resolver->setAllowedTypes('max_breadcrumbs', 'int');
$resolver->setAllowedTypes('before_breadcrumb', ['callable']);
$resolver->setAllowedTypes('integrations', ['Sentry\\Integration\\IntegrationInterface[]', 'callable']);
$resolver->setAllowedTypes('send_default_pii', 'bool');
$resolver->setAllowedTypes('default_integrations', 'bool');
$resolver->setAllowedTypes('max_value_length', 'int');
$resolver->setAllowedTypes('http_proxy', ['null', 'string']);
$resolver->setAllowedTypes('http_connect_timeout', ['int', 'float']);
$resolver->setAllowedTypes('http_timeout', ['int', 'float']);
$resolver->setAllowedTypes('capture_silenced_errors', 'bool');
$resolver->setAllowedTypes('max_request_body_size', 'string');
$resolver->setAllowedTypes('class_serializers', 'array');
$resolver->setAllowedValues('max_request_body_size', ['none', 'never', 'small', 'medium', 'always']);
$resolver->setAllowedValues('dsn', \Closure::fromCallable([$this, 'validateDsnOption']));
$resolver->setAllowedValues('max_breadcrumbs', \Closure::fromCallable([$this, 'validateMaxBreadcrumbsOptions']));
$resolver->setAllowedValues('class_serializers', \Closure::fromCallable([$this, 'validateClassSerializersOption']));
$resolver->setAllowedValues('context_lines', \Closure::fromCallable([$this, 'validateContextLinesOption']));
$resolver->setNormalizer('dsn', \Closure::fromCallable([$this, 'normalizeDsnOption']));
$resolver->setNormalizer('tags', static function (SymfonyOptions $options, array $value): array {
if (!empty($value)) {
@trigger_error('The option "tags" is deprecated since version 3.2 and will be removed in 4.0. Either set the tags on the scope or on the event.', \E_USER_DEPRECATED);
}
return $value;
});
$resolver->setNormalizer('prefixes', function (SymfonyOptions $options, array $value) {
return array_map([$this, 'normalizeAbsolutePath'], $value);
});
$resolver->setNormalizer('in_app_exclude', function (SymfonyOptions $options, array $value) {
return array_map([$this, 'normalizeAbsolutePath'], $value);
});
$resolver->setNormalizer('in_app_include', function (SymfonyOptions $options, array $value) {
return array_map([$this, 'normalizeAbsolutePath'], $value);
});
$resolver->setNormalizer('logger', function (SymfonyOptions $options, ?string $value): ?string {
if ('php' !== $value) {
@trigger_error('The option "logger" is deprecated.', \E_USER_DEPRECATED);
}
return $value;
});
}
/**
* Normalizes the given path as an absolute path.
*
* @param string $value The path
*/
private function normalizeAbsolutePath(string $value): string
{
$path = @realpath($value);
if (false === $path) {
$path = $value;
}
return $path;
}
/**
* Normalizes the DSN option by parsing the host, public and secret keys and
* an optional path.
*
* @param SymfonyOptions $options The configuration options
* @param string|bool|Dsn|null $value The actual value of the option to normalize
*/
private function normalizeDsnOption(SymfonyOptions $options, $value): ?Dsn
{
if (null === $value || \is_bool($value)) {
return null;
}
if ($value instanceof Dsn) {
return $value;
}
switch (strtolower($value)) {
case '':
case 'false':
case '(false)':
case 'empty':
case '(empty)':
case 'null':
case '(null)':
return null;
}
return Dsn::createFromString($value);
}
/**
* Validates the DSN option ensuring that all required pieces are set and
* that the URL is valid.
*
* @param string|bool|Dsn|null $dsn The value of the option
*/
private function validateDsnOption($dsn): bool
{
if (null === $dsn || $dsn instanceof Dsn) {
return true;
}
if (\is_bool($dsn)) {
return false === $dsn;
}
switch (strtolower($dsn)) {
case '':
case 'false':
case '(false)':
case 'empty':
case '(empty)':
case 'null':
case '(null)':
return true;
}
try {
Dsn::createFromString($dsn);
return true;
} catch (\InvalidArgumentException $exception) {
return false;
}
}
/**
* Validates if the value of the max_breadcrumbs option is in range.
*
* @param int $value The value to validate
*/
private function validateMaxBreadcrumbsOptions(int $value): bool
{
return $value >= 0 && $value <= self::DEFAULT_MAX_BREADCRUMBS;
}
/**
* Validates that the values passed to the `class_serializers` option are valid.
*
* @param mixed[] $serializers The value to validate
*/
private function validateClassSerializersOption(array $serializers): bool
{
foreach ($serializers as $class => $serializer) {
if (!\is_string($class) || !\is_callable($serializer)) {
return false;
}
}
return true;
}
/**
* Validates that the value passed to the "context_lines" option is valid.
*
* @param int|null $contextLines The value to validate
*/
private function validateContextLinesOption(?int $contextLines): bool
{
return null === $contextLines || $contextLines >= 0;
}
}
xxxxx1.0, XXX xxxx