/
githubmirror
/
symfony
Обзор
Документация
Войти
/
githubmirror
/
symfony
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
8.2
src/Symfony/Component/HttpFoundation/ServerEvent.php
160 строк
4 KB
Nicolas Grekas
[HttpFoundation] Fix newline handling in server event fields
29 июл 2026, 09:36
29 июл 2026, 09:36
d714212
Код
Авторство
О чём код?
<?php /* * This file is part of the Symfony package. * * (c) Fabien Potencier <fabien@symfony.com> * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpFoundation; /** * An event generated on the server intended for streaming to the client * as part of the SSE streaming technique. * * @implements \IteratorAggregate<string> * * @author Yonel Ceruto <open@yceruto.dev> */ class ServerEvent implements \IteratorAggregate { /** * @param string|iterable<string> $data The event data field for the message * @param string|null $type The event type * @param int|null $retry The number of milliseconds the client should wait * before reconnecting in case of network failure * @param string|null $id The event ID to set the EventSource object's last event ID value * @param string|null $comment The event comment */ public function __construct( private string|iterable $data, private ?string $type = null, private ?int $retry = null, private ?string $id = null, private ?string $comment = null, ) { } public function getData(): iterable|string { return $this->data; } /** * @return $this */ public function setData(iterable|string $data): static { $this->data = $data; return $this; } public function getType(): ?string { return $this->type; } /** * @return $this */ public function setType(string $type): static { $this->type = $type; return $this; } public function getRetry(): ?int { return $this->retry; } /** * @return $this */ public function setRetry(?int $retry): static { $this->retry = $retry; return $this; } public function getId(): ?string { return $this->id; } /** * @return $this */ public function setId(string $id): static { $this->id = $id; return $this; } public function getComment(): ?string { return $this->comment; } public function setComment(string $comment): static { $this->comment = $comment; return $this; } /** * @return \Traversable<string> */ public function getIterator(): \Traversable { $head = ''; if ($this->comment) { $head .= self::field(': ', $this->comment); } if ($this->id) { $head .= \sprintf('id: %s', self::singleLine($this->id))."\n"; } if ($this->retry > 0) { $head .= \sprintf('retry: %s', $this->retry)."\n"; } if ($this->type) { $head .= \sprintf('event: %s', self::singleLine($this->type))."\n"; } yield $head; if (is_iterable($this->data)) { foreach ($this->data as $data) { yield self::field('data: ', $data); } } elseif ('' !== $this->data) { yield self::field('data: ', $this->data); } yield "\n"; } /** * Renders a multi-line value as one prefixed line per line of the value. */ private static function field(string $prefix, string $value): string { return $prefix.implode("\n".$prefix, preg_split("/\r\n|[\r\n]/", $value))."\n"; } /** * Removes the line terminators that would end the field early, as the * SSE specification defines these fields as single-line only. */ private static function singleLine(string $value): string { return str_replace(["\r", "\n"], '', $value); } }