From df90936a15128afaf0c2b51ab55ec704419e8631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hu=CC=88rtgen?= Date: Tue, 27 Dec 2022 22:30:56 +0100 Subject: [PATCH] FIX: Read the whole stream and perform code transformations First read the whole stream and afterwards perform code transformations. This will ensure to also replace code, which is divided into chunks while reading a file. Fixes #268 and #383 (cherry picked from commit 1917d661757c8338311f606431bc1ed7941244cf) --- .../CodeTransform/AbstractCodeTransform.php | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/VCR/CodeTransform/AbstractCodeTransform.php b/src/VCR/CodeTransform/AbstractCodeTransform.php index 05b69dbe2..7e3e0f964 100644 --- a/src/VCR/CodeTransform/AbstractCodeTransform.php +++ b/src/VCR/CodeTransform/AbstractCodeTransform.php @@ -12,6 +12,9 @@ abstract class AbstractCodeTransform extends \php_user_filter { public const NAME = 'vcr_abstract_filter'; + /** @var string */ + private $data = ''; + /** * Attaches the current filter to a stream. */ @@ -19,7 +22,10 @@ public function register(): void { if (!\in_array(static::NAME, stream_get_filters(), true)) { $isRegistered = stream_filter_register(static::NAME, static::class); - Assertion::true($isRegistered, sprintf('Failed registering stream filter "%s" on stream "%s"', static::class, static::NAME)); + Assertion::true( + $isRegistered, + sprintf('Failed registering stream filter "%s" on stream "%s"', static::class, static::NAME) + ); } } @@ -37,12 +43,19 @@ public function register(): void */ public function filter($in, $out, &$consumed, $closing) { - while ($bucket = stream_bucket_make_writeable($in)) { - $bucket->data = $this->transformCode($bucket->data); - $consumed += $bucket->datalen; - stream_bucket_append($out, $bucket); + while ($buffer = stream_bucket_make_writeable($in)) { + $this->data .= $buffer->data; + $consumed += $buffer->datalen; + } + + if (!$closing) { + return \PSFS_FEED_ME; } + $bucket = stream_bucket_new($this->stream, $this->transformCode($this->data)); + $this->data = ''; + stream_bucket_append($out, $bucket); + return \PSFS_PASS_ON; }