PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.12.1
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.12.1
5.12.1 5.12.0 5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / vendor / prefixed / symfony / var-dumper / Server / DumpServer.php
matomo / app / vendor / prefixed / symfony / var-dumper / Server Last commit date
Connection.php 1 year ago DumpServer.php 1 year ago
DumpServer.php
97 lines
1 <?php
2
3 /*
4 * This file is part of the Symfony package.
5 *
6 * (c) Fabien Potencier <fabien@symfony.com>
7 *
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
10 */
11 namespace Matomo\Dependencies\Symfony\Component\VarDumper\Server;
12
13 use Matomo\Dependencies\Psr\Log\LoggerInterface;
14 use Matomo\Dependencies\Symfony\Component\VarDumper\Cloner\Data;
15 use Matomo\Dependencies\Symfony\Component\VarDumper\Cloner\Stub;
16 /**
17 * A server collecting Data clones sent by a ServerDumper.
18 *
19 * @author Maxime Steinhausser <maxime.steinhausser@gmail.com>
20 *
21 * @final
22 */
23 class DumpServer
24 {
25 private $host;
26 private $logger;
27 /**
28 * @var resource|null
29 */
30 private $socket;
31 public function __construct(string $host, ?LoggerInterface $logger = null)
32 {
33 if (!str_contains($host, '://')) {
34 $host = 'tcp://' . $host;
35 }
36 $this->host = $host;
37 $this->logger = $logger;
38 }
39 public function start() : void
40 {
41 if (!($this->socket = stream_socket_server($this->host, $errno, $errstr))) {
42 throw new \RuntimeException(sprintf('Server start failed on "%s": ', $this->host) . $errstr . ' ' . $errno);
43 }
44 }
45 public function listen(callable $callback) : void
46 {
47 if (null === $this->socket) {
48 $this->start();
49 }
50 foreach ($this->getMessages() as $clientId => $message) {
51 if ($this->logger) {
52 $this->logger->info('Received a payload from client {clientId}', ['clientId' => $clientId]);
53 }
54 $payload = @unserialize(base64_decode($message), ['allowed_classes' => [Data::class, Stub::class]]);
55 // Impossible to decode the message, give up.
56 if (\false === $payload) {
57 if ($this->logger) {
58 $this->logger->warning('Unable to decode a message from {clientId} client.', ['clientId' => $clientId]);
59 }
60 continue;
61 }
62 if (!\is_array($payload) || \count($payload) < 2 || !$payload[0] instanceof Data || !\is_array($payload[1])) {
63 if ($this->logger) {
64 $this->logger->warning('Invalid payload from {clientId} client. Expected an array of two elements (Data $data, array $context)', ['clientId' => $clientId]);
65 }
66 continue;
67 }
68 [$data, $context] = $payload;
69 $callback($data, $context, $clientId);
70 }
71 }
72 public function getHost() : string
73 {
74 return $this->host;
75 }
76 private function getMessages() : iterable
77 {
78 $sockets = [(int) $this->socket => $this->socket];
79 $write = [];
80 while (\true) {
81 $read = $sockets;
82 stream_select($read, $write, $write, null);
83 foreach ($read as $stream) {
84 if ($this->socket === $stream) {
85 $stream = stream_socket_accept($this->socket);
86 $sockets[(int) $stream] = $stream;
87 } elseif (feof($stream)) {
88 unset($sockets[(int) $stream]);
89 fclose($stream);
90 } else {
91 (yield (int) $stream => fgets($stream));
92 }
93 }
94 }
95 }
96 }
97