6 use InvalidArgumentException;
7 use ReflectionFunction;
19 private $closed =
true;
20 private $supportsClose =
false;
24 $this->closed =
false;
26 if (!is_callable($this->params)) {
27 throw new InvalidArgumentException(
'No valid callback parameter given to stream_filter_(append|prepend)');
29 $this->callback = $this->params;
32 $ref =
new ReflectionFunction($this->callback);
33 $this->supportsClose = ($ref->getNumberOfRequiredParameters() === 0);
43 if ($this->supportsClose) {
44 $this->supportsClose =
false;
47 call_user_func($this->callback);
48 }
catch (Exception $ignored) {
55 $this->callback =
null;
58 public function filter($in, $out, &$consumed, $closing)
62 while ($bucket = stream_bucket_make_writeable($in)) {
63 $consumed += $bucket->datalen;
64 $data .= $bucket->data;
76 $data = call_user_func($this->callback, $data);
77 }
catch (Exception $e) {
80 trigger_error(
'Error invoking filter: ' . $e->getMessage(), E_USER_WARNING);
82 return PSFS_ERR_FATAL;
91 if ($this->supportsClose) {
92 $this->supportsClose =
false;
96 $data .= call_user_func($this->callback);
97 }
catch (Exception $e) {
98 trigger_error(
'Error ending filter: ' . $e->getMessage(), E_USER_WARNING);
100 return PSFS_ERR_FATAL;
108 $bucket = @stream_bucket_new($this->stream, $data);
113 if ($bucket !==
false) {
114 stream_bucket_append($out, $bucket);