Browse Source
Fixed error conditions handling in stream_filter_append()
experimental/first_unicode_implementation
Fixed error conditions handling in stream_filter_append()
experimental/first_unicode_implementation
7 changed files with 198 additions and 17 deletions
-
17ext/standard/streamsfuncs.c
-
34ext/standard/tests/filters/filter_errors.inc
-
16ext/standard/tests/filters/filter_errors_convert_base64_decode.phpt
-
84ext/standard/tests/filters/filter_errors_user.phpt
-
14ext/standard/tests/filters/filter_errors_zlib_inflate.phpt
-
48main/streams/filter.c
-
2main/streams/php_stream_filter_api.h
@ -0,0 +1,34 @@ |
|||
<?php |
|||
|
|||
function filter_errors_skipif($needle) { |
|||
$filters = stream_get_filters(); |
|||
foreach($filters as $filter) { |
|||
if (fnmatch($filter, $needle)) return; |
|||
} |
|||
die("skip $needle not available"); |
|||
} |
|||
|
|||
function filter_errors_test($filter, $data) { |
|||
|
|||
echo "test filtering of buffered data\n"; |
|||
|
|||
$stream = fopen('php://memory', 'wb+'); |
|||
|
|||
fwrite($stream, b".\r\n$data"); |
|||
fseek($stream, 0, SEEK_SET); |
|||
stream_get_line($stream, 8192, "\r\n"); |
|||
|
|||
$f = stream_filter_append($stream, $filter); |
|||
|
|||
echo "test filtering of non buffered data\n"; |
|||
|
|||
$stream = fopen('php://memory', 'wb+'); |
|||
|
|||
fwrite($stream, b"$data"); |
|||
fseek($stream, 0, SEEK_SET); |
|||
|
|||
stream_get_line($stream, 8192, "\r\n"); |
|||
stream_get_contents($stream); |
|||
|
|||
} |
|||
|
|||
@ -0,0 +1,16 @@ |
|||
--TEST-- |
|||
Filter errors: convert.base64-decode |
|||
--SKIPIF-- |
|||
<?php require 'filter_errors.inc'; filter_errors_skipif('convert.base64-decode'); ?> |
|||
--FILE-- |
|||
<?php |
|||
require 'filter_errors.inc'; |
|||
filter_errors_test('convert.base64-decode', '==='); |
|||
?> |
|||
--EXPECTF-- |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): stream filter (convert.base64-decode): invalid byte sequence in %s |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
@ -0,0 +1,84 @@ |
|||
--TEST-- |
|||
Filter errors: user filter |
|||
--FILE-- |
|||
<?php |
|||
require 'filter_errors.inc'; |
|||
|
|||
class test_filter0 extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
return PSFS_ERR_FATAL; |
|||
} |
|||
} |
|||
class test_filter1 extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
$bucket = stream_bucket_make_writeable($in); |
|||
return PSFS_ERR_FATAL; |
|||
} |
|||
} |
|||
class test_filter2 extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
while ($bucket = stream_bucket_make_writeable($in)) { |
|||
$consumed += $bucket->datalen; |
|||
stream_bucket_append($out, $bucket); |
|||
} |
|||
return PSFS_ERR_FATAL; |
|||
} |
|||
} |
|||
class test_filter3 extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
$bucket = stream_bucket_new($this->stream, "42"); |
|||
stream_bucket_append($out, $bucket); |
|||
return PSFS_ERR_FATAL; |
|||
} |
|||
} |
|||
class test_filter4 extends php_user_filter { |
|||
function filter($in, $out, &$consumed, $closing) { |
|||
$bucket = stream_bucket_new($this->stream, "42"); |
|||
return PSFS_ERR_FATAL; |
|||
} |
|||
} |
|||
|
|||
for($i = 0; $i < 5; ++$i) { |
|||
echo "test_filter$i\n"; |
|||
var_dump(stream_filter_register("test_filter$i", "test_filter$i")); |
|||
filter_errors_test("test_filter$i", "42"); |
|||
} |
|||
|
|||
?> |
|||
--EXPECTF-- |
|||
test_filter0 |
|||
bool(true) |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
test_filter1 |
|||
bool(true) |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
test_filter2 |
|||
bool(true) |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
test_filter3 |
|||
bool(true) |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
test_filter4 |
|||
bool(true) |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Unprocessed filter buckets remaining on input brigade in %s |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
@ -0,0 +1,14 @@ |
|||
--TEST-- |
|||
Filter errors: zlib.inflate |
|||
--SKIPIF-- |
|||
<?php require 'filter_errors.inc'; filter_errors_skipif('zlib.inflate'); ?> |
|||
--FILE-- |
|||
<?php |
|||
require 'filter_errors.inc'; |
|||
filter_errors_test('zlib.inflate', gzencode(b'42')); |
|||
?> |
|||
--EXPECTF-- |
|||
test filtering of buffered data |
|||
|
|||
Warning: stream_filter_append(): Filter failed to process pre-buffered data in %s |
|||
test filtering of non buffered data |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue