Open Journal Systems  3.3.0
FilteredStream.php
1 <?php
2 
3 namespace Http\Message\Encoding;
4 
8 
14 abstract class FilteredStream implements StreamInterface
15 {
16  const BUFFER_SIZE = 8192;
17 
18  use StreamDecorator {
19  rewind as private doRewind;
20  seek as private doSeek;
21  }
22 
26  protected $readFilterCallback;
27 
33  protected $readFilter;
34 
40  protected $writeFilterCallback;
41 
47  protected $writeFilter;
48 
54  protected $buffer = '';
55 
61  public function __construct(StreamInterface $stream, $readFilterOptions = null, $writeFilterOptions = null)
62  {
63  if (null !== $readFilterOptions) {
64  $this->readFilterCallback = Filter\fun($this->readFilter(), $readFilterOptions);
65  } else {
66  $this->readFilterCallback = Filter\fun($this->readFilter());
67  }
68 
69  if (null !== $writeFilterOptions) {
70  $this->writeFilterCallback = Filter\fun($this->writeFilter(), $writeFilterOptions);
71 
72  @trigger_error('The $writeFilterOptions argument is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);
73  } else {
74  $this->writeFilterCallback = Filter\fun($this->writeFilter());
75  }
76 
77  $this->stream = $stream;
78  }
79 
83  public function read($length)
84  {
85  if (strlen($this->buffer) >= $length) {
86  $read = substr($this->buffer, 0, $length);
87  $this->buffer = substr($this->buffer, $length);
88 
89  return $read;
90  }
91 
92  if ($this->stream->eof()) {
94  $this->buffer = '';
95 
96  return $buffer;
97  }
98 
99  $read = $this->buffer;
100  $this->buffer = '';
101  $this->fill();
102 
103  return $read.$this->read($length - strlen($read));
104  }
105 
109  public function eof()
110  {
111  return $this->stream->eof() && '' === $this->buffer;
112  }
113 
121  protected function fill()
122  {
124  $this->buffer .= $readFilterCallback($this->stream->read(self::BUFFER_SIZE));
125 
126  if ($this->stream->eof()) {
127  $this->buffer .= $readFilterCallback();
128  }
129  }
130 
134  public function getContents()
135  {
136  $buffer = '';
137 
138  while (!$this->eof()) {
139  $buf = $this->read(self::BUFFER_SIZE);
140  // Using a loose equality here to match on '' and false.
141  if (null == $buf) {
142  break;
143  }
144 
145  $buffer .= $buf;
146  }
147 
148  return $buffer;
149  }
150 
154  public function getSize()
155  {
156  return null;
157  }
158 
162  public function __toString()
163  {
164  return $this->getContents();
165  }
166 
172  public function isSeekable()
173  {
174  return false;
175  }
176 
180  public function rewind()
181  {
182  @trigger_error('Filtered streams are not seekable. This method will start raising an exception in the next major version', E_USER_DEPRECATED);
183  $this->doRewind();
184  }
185 
189  public function seek($offset, $whence = SEEK_SET)
190  {
191  @trigger_error('Filtered streams are not seekable. This method will start raising an exception in the next major version', E_USER_DEPRECATED);
192  $this->doSeek($offset, $whence);
193  }
194 
202  public function getReadFilter()
203  {
204  @trigger_error('The '.__CLASS__.'::'.__METHOD__.' method is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);
205 
206  return $this->readFilter();
207  }
208 
214  abstract protected function readFilter();
215 
223  public function getWriteFilter()
224  {
225  @trigger_error('The '.__CLASS__.'::'.__METHOD__.' method is deprecated since version 1.5 and will be removed in 2.0.', E_USER_DEPRECATED);
226 
227  return $this->writeFilter();
228  }
229 
235  abstract protected function writeFilter();
236 }
Http\Message\Encoding\FilteredStream\eof
eof()
Definition: FilteredStream.php:124
Http\Message\Encoding\FilteredStream\__toString
__toString()
Definition: FilteredStream.php:177
Http\Message\Encoding\FilteredStream\getContents
getContents()
Definition: FilteredStream.php:149
Http\Message\Encoding\FilteredStream\$readFilterCallback
$readFilterCallback
Definition: FilteredStream.php:29
Http\Message\Encoding\FilteredStream\rewind
rewind()
Definition: FilteredStream.php:195
Psr\Http\Message\StreamInterface
Definition: vendor/psr/http-message/src/StreamInterface.php:12
Http\Message\Encoding\FilteredStream\$writeFilterCallback
$writeFilterCallback
Definition: FilteredStream.php:49
Http\Message\Encoding\FilteredStream\$buffer
$buffer
Definition: FilteredStream.php:69
Clue\StreamFilter
Definition: CallbackFilter.php:3
Http\Message\Encoding\FilteredStream\getSize
getSize()
Definition: FilteredStream.php:169
Http\Message\Encoding\FilteredStream\isSeekable
isSeekable()
Definition: FilteredStream.php:187
Http\Message\Encoding\FilteredStream
Definition: FilteredStream.php:14
Http\Message\Encoding\FilteredStream\getReadFilter
getReadFilter()
Definition: FilteredStream.php:217
Http\Message\Encoding\FilteredStream\BUFFER_SIZE
const BUFFER_SIZE
Definition: FilteredStream.php:16
Http\Message\Encoding\FilteredStream\__construct
__construct(StreamInterface $stream, $readFilterOptions=null, $writeFilterOptions=null)
Definition: FilteredStream.php:76
Http\Message\Encoding
Definition: ChunkStream.php:3
Http\Message\Encoding\FilteredStream\readFilter
readFilter()
Http\Message\Encoding\FilteredStream\$writeFilter
$writeFilter
Definition: FilteredStream.php:59
Http\Message\Decorator\StreamDecorator
trait StreamDecorator
Definition: StreamDecorator.php:13
Http\Message\Encoding\FilteredStream\read
read($length)
Definition: FilteredStream.php:98
Http\Message\Encoding\FilteredStream\$readFilter
$readFilter
Definition: FilteredStream.php:39
Http\Message\Encoding\FilteredStream\seek
seek($offset, $whence=SEEK_SET)
Definition: FilteredStream.php:204
Http\Message\Encoding\FilteredStream\getWriteFilter
getWriteFilter()
Definition: FilteredStream.php:238
Http\Message\Encoding\FilteredStream\writeFilter
writeFilter()
Http\Message\Encoding\FilteredStream\fill
fill()
Definition: FilteredStream.php:136