diff --git a/UPGRADING b/UPGRADING index f24ea681be2e..24acd5ba5e99 100644 --- a/UPGRADING +++ b/UPGRADING @@ -82,6 +82,9 @@ PHP 8.6 UPGRADE NOTES values. - Standard: + . Stateful stream filters (e.g. "dechunk", "consumed", "convert.*") now + reset their internal state when the stream is sought to position 0. + See bug #49874. . Form feed (\f) is now added in the default trimmed characters of trim(), rtrim() and ltrim(). RFC: https://wiki.php.net/rfc/trim_form_feed . array_filter() now raises a ValueError when an invalid $mode diff --git a/ext/standard/tests/filters/dechunk_seek_resets_state.phpt b/ext/standard/tests/filters/dechunk_seek_resets_state.phpt new file mode 100644 index 000000000000..ccb57d87ec81 --- /dev/null +++ b/ext/standard/tests/filters/dechunk_seek_resets_state.phpt @@ -0,0 +1,53 @@ +--TEST-- +dechunk filter: seeking to position 0 resets the filter's internal state +--SKIPIF-- + +--FILE-- + $before); + +// stream_get_contents($h, -1, 0) performs an implicit seek to 0 +$h = fopen('php://temp', 'w+'); +stream_filter_append($h, 'dechunk', STREAM_FILTER_WRITE); +fwrite($h, $body); +stream_get_contents($h, -1, 0); +$before = ftell($h); +fwrite($h, '-'); +var_dump(ftell($h) > $before); + +// after reset, the filter correctly decodes a fresh chunked body +$h = fopen('php://temp', 'w+'); +stream_filter_append($h, 'dechunk', STREAM_FILTER_WRITE); +fwrite($h, $body); +rewind($h); +ftruncate($h, 0); +fwrite($h, "1\r\nX\r\n0\r\n\r\n"); +var_dump(stream_get_contents($h, -1, 0)); + +?> +--EXPECT-- +bool(true) +bool(true) +bool(true) +string(1) "X"