namespace GuzzleHttp\Psr7;
use Psr\Http\Message\StreamInterface;
* Provides a buffer stream that can be written to to fill a buffer, and read
* from to remove bytes from the buffer.
* This stream returns a "hwm" metadata value that tells upstream consumers
* what the configured high water mark of the stream is, or the maximum
* preferred size of the buffer.
class BufferStream implements StreamInterface
* @param int $hwm High water mark, representing the preferred maximum
* buffer size. If the size of the buffer exceeds the high
* water mark, then calls to write will continue to succeed
* but will return false to inform writers to slow down
* until the buffer has been drained by reading from it.
public function __construct($hwm = 16384)
public function __toString()
return $this->getContents();
public function getContents()
public function getSize()
return strlen($this->buffer);
public function isReadable()
public function isWritable()
public function isSeekable()
public function seek($offset, $whence = SEEK_SET)
throw new \RuntimeException('Cannot seek a BufferStream');
return strlen($this->buffer) === 0;
throw new \RuntimeException('Cannot determine the position of a BufferStream');
* Reads data from the buffer.
public function read($length)
$currentLength = strlen($this->buffer);
if ($length >= $currentLength) {
// No need to slice the buffer because we don't have enough data.
// Slice up the result to provide a subset of the buffer.
$result = substr($this->buffer, 0, $length);
$this->buffer = substr($this->buffer, $length);
* Writes data to the buffer.
public function write($string)
$this->buffer .= $string;
// TODO: What should happen here?
if (strlen($this->buffer) >= $this->hwm) {
public function getMetadata($key = null)