Skip to content

Commit

Permalink
- Fix reading stream filters never notified about EOF
Browse files Browse the repository at this point in the history
  • Loading branch information
m6w6 committed Apr 20, 2006
1 parent bdef85a commit f7a6327
Show file tree
Hide file tree
Showing 3 changed files with 75 additions and 2 deletions.
1 change: 1 addition & 0 deletions NEWS
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? Apr 2006, PHP 5.1.3
- Fixed reading stream filters never notified about EOF. (Mike)
- Fixed bug #37138 (__autoload tries to load callback'ed self and parent).
(Dmitry)
- Fixed bug #37103 (libmbfl headers not installed). (Jani)
Expand Down
72 changes: 72 additions & 0 deletions ext/standard/tests/filters/read.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
--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($f, 8192);
}
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($F, 8192);
}
FCLOSE($F);
}
ECHO "DONE\N";
?>

===close===
Done
4 changes: 2 additions & 2 deletions main/streams/streams.c
Original file line number Diff line number Diff line change
Expand Up @@ -433,7 +433,7 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D
/* allocate a buffer for reading chunks */
chunk_buf = emalloc(stream->chunk_size);

while (!err_flag && (stream->writepos - stream->readpos < (off_t)size)) {
while (!stream->eof && !err_flag && (stream->writepos - stream->readpos < (off_t)size)) {
size_t justread = 0;
int flags;
php_stream_bucket *bucket;
Expand All @@ -442,7 +442,7 @@ static void php_stream_fill_read_buffer(php_stream *stream, size_t size TSRMLS_D

/* read a chunk into a bucket */
justread = stream->ops->read(stream, chunk_buf, stream->chunk_size TSRMLS_CC);
if (justread != (size_t)-1) {
if (justread && justread != (size_t)-1) {
bucket = php_stream_bucket_new(stream, chunk_buf, justread, 0, 0 TSRMLS_CC);

/* after this call, bucket is owned by the brigade */
Expand Down

0 comments on commit f7a6327

Please sign in to comment.