--TEST--
stream filter - reading
--FILE--
<?php
echo "-TEST\n";
class 
filter extends php_user_filter {
    function 
filter($in$out, &$consumed$closing)
    {
        
$output 0;
        while (
$bucket stream_bucket_make_writeable($in)) {
            
$bucket->data strtoupper($bucket->data);
            
$consumed += $bucket->datalen;
            
stream_bucket_append($out$bucket);
            
$output 1;
        }
        if (
$closing) {
            
$bucket stream_bucket_new($this->stream"\n===close===\n");
            
stream_bucket_append($out$bucket);
            
$output 1;
        }
        return 
$output PSFS_PASS_ON PSFS_FEED_ME;
    }
}
stream_filter_register("strtoupper""filter")
   or die(
"Failed to register filter");

if (
$f fopen(__FILE__"rb")) {
    
stream_filter_append($f"strtoupper");
    while (!
feof($f)) {
        echo 
fread($f8192);
    }
    
fclose($f);
}
echo 
"Done\n";
?>
--EXPECTF--
%sTEST
<?PHP
ECHO "-TEST\N";
CLASS 
FILTER EXTENDS PHP_USER_FILTER {
    FUNCTION 
FILTER($IN$OUT, &$CONSUMED$CLOSING)
    {
        
$OUTPUT 0;
        WHILE (
$BUCKET STREAM_BUCKET_MAKE_WRITEABLE($IN)) {
            
$BUCKET->DATA STRTOUPPER($BUCKET->DATA);
            
$CONSUMED += $BUCKET->DATALEN;
            
STREAM_BUCKET_APPEND($OUT$BUCKET);
            
$OUTPUT 1;
        }
        IF (
$CLOSING) {
            
$BUCKET STREAM_BUCKET_NEW($THIS->STREAM"\N===CLOSE===\N");
            
STREAM_BUCKET_APPEND($OUT$BUCKET);
            
$OUTPUT 1;
        }
        RETURN 
$OUTPUT PSFS_PASS_ON PSFS_FEED_ME;
    }
}
STREAM_FILTER_REGISTER("STRTOUPPER""FILTER")
   OR DIE(
"FAILED TO REGISTER FILTER");

IF (
$F FOPEN(__FILE__"RB")) {
    
STREAM_FILTER_APPEND($F"STRTOUPPER");
    WHILE (!
FEOF($F)) {
        ECHO 
FREAD($F8192);
    }
    
FCLOSE($F);
}
ECHO 
"DONE\N";
?>

===close===
Done